[FX.php List] FMPHP API
DC
dan.cynosure at dbmscan.com
Tue Aug 1 22:18:52 MDT 2006
Yes, AC, you are absolutely right. That code was broken! I'd like to
say it was some genius pedagogical method to help you become a better
PHP programmer but really it was my poor debugging. Thanks for
pointing out the deficiencies in the code I posted.
Anyhow, it looks like you've got a tidy little 2-line function that
uses some more standard code substr() and strpos(). Congratulations!
Since I can't believe I posted broken code to everyone on the list,
I've gone back to the drawing board and fixed them both.
For posterity, here are the fixed versions of both the preg_split()
and sscanf() Value List parser. The %d in sscanf() tells the parser
to grab anything that looks like a number at the beginning of the
string. the %[^$]s tells the parser to look for everything else that
is a string up to the end of the string.
What can I say... I LOVE oneliners like this (you don't even need to
use list() since sscanf() has builtin assignment):
list($num,$text)=sscanf($string_to_parse,'%d %[^$]s'); // pretty
sscanf($string_to_parse,'%d %[^$]s',$num,$text); // prettier
<?php
// shows two ways to parse a slightly complicated string
$value_list = array("311 Dell", "12 My Company Name");
// parse the strings using preg_split()
foreach ($value_list as $string_to_parse) {
list($num,$text)=preg_split('/([0-9]+)\s([a-zA-Z\s]+)/',
$string_to_parse,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
echo "§
string: $string_to_parse<br>
num: $num<br>
text: $text<br>";
}
echo "<hr>";
// show sscanf() doing the same thing
foreach ($value_list as $string_to_parse) {
sscanf($string_to_parse,'%d %[^$]s',$num,$text);
echo "§
string: $string_to_parse<br>
num: $num<br>
text: $text<br>";
}
?>
i replaced the snippet too. http://dbmscan.com/snippets
it's in misc section.
cheers,
dan
On Aug 1, 2006, at 10:57 PM, AC wrote:
> Dan,
> First let me say thanks for your quick replies.
> I tried your code:
>
> $value_list = array("311 Dell", "12 My Company Name");
> foreach ($value_list as $string_to_parse) {
> list($num,$text)=sscanf($string_to_parse,'%d %s');
> echo "num: $num <br>text: $text <br>";
> }
>
> Instead of "My Company Name" I only got "My". I assume "%d" is a
> new line character and there wasn't one after "My Company Name" so
> it only grabbed up to the space after "My".
>
>
>
> What I really wanted was the equivalent of FMP's;
> Left($TheText, Position($TheText, " ", 1, 1) - 1) //grab up to
> the space but not the space
> and
> Replace($TheText, 1, Position($TheText, " ", 1, 1), "") //grab
> everything after the space (excluding the space)
>
>
> I think I finally have it using PHP's;
> substr($TheText, 0, strpos($TheText, ' ')); //grab up to the
> space but not the space
> and
> substr_replace($TheText, '', 0, strpos($TheText, ' ') + 1); //
> grab everything after the (space excluding the space)
>
>
>
>
> On Aug 1, 2006, at 5:37 PM, DC wrote:
>
>> ok, now we're getting somewhere.
>>
>> so, you have a more complicated parsing task.
>>
>> you don't just have a space delimited string, you have a number,
>> then a space, then some range of characters that could also
>> include a space. that, of course, would confound a simple list()
>> and explode() parser.
>>
>> you now have two choices(besides your clever but opaque use of
>> strcspn()!), both of which incidentally still use list():
>>
>> list() with sscanf()
>>
>> OR
>>
>> list with() preg_split()
>>
>> both of these functions offer VERY powerful parsing for almost
>> every situation. it would behoove any new PHP coder to become
>> familiar with both.
>>
>> try one of these parsing techniques. i think the sscanf() version
>> is a little cleaner, but some people might be more familiar with
>> regular expressions than with the sscanf() parsing language. in
>> this case, though sscanf() parsing definition is VERY easy to read
>> and the preg_split() regular expression is not and the preg_split
>> () function requires 2 ugly CONSTANTS to make it behave. for other
>> tasks preg_split() will be better, but in this case sscanf() shines.
>>
>> i set these up in a repeat loop to show how they successfully
>> parse your range of strings.
>>
>> <?php
>> // shows two ways to parse a slightly complicated string
>>
>> $value_list = array("311 Dell", "12 My Company Name");
>>
>> // parse the strings using preg_split()
>> foreach ($value_list as $string_to_parse) {
>> echo $string_to_parse.'<br>';
>> list($num,$text)=preg_split('/([0-9]+)\s([a-zA-Z]+)/',
>> $string_to_parse,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
>> echo "num: $num <br>";
>> echo "text: $text <br>";
>> }
>>
>> echo "<hr>";
>>
>> // show sscanf() doing the same thing
>> foreach ($value_list as $string_to_parse) {
>> echo $string_to_parse.'<br>';
>> list($num,$text)=sscanf($string_to_parse,'%d %s');
>> echo "num: $num <br>";
>> echo "text: $text <br>";
>> }
>>
>> ?>
>>
>> in case your email reader mangles the code, i put it here in
>> Miscellaneous section:
>> http://www.dbmscan.com/snippets/index.php?cat_select=Miscellaneous
>>
>> your choice. let me know if i can be of assistance...
>>
>> cheers,
>> dan
>>
>>
>>
>> On Aug 1, 2006, at 4:17 PM, AC wrote:
>>
>>> Dan,
>>>
>>> I needed the contents of a FM valuelist in PHP.
>>> The values could be "311 Dell" or "12 My Company Name".
>>> Should I still be using the list() & explode() function to obtain
>>> the ID number portion?
>>> If I should use the substr() function, then what function do I
>>> use to determine how many characters the ID is?
>>>
>>>
>>>
>>>
>>> On Aug 1, 2006, at 4:03 PM, DC wrote:
>>>
>>>> hi AC,
>>>>
>>>> just to make sure we're still talking about the same issue here...
>>>>
>>>> you want to take a string, say "311 Dell", and assign two
>>>> variables, one that holds the first part and one that holds the
>>>> second part. the first and second part are separated (delimited)
>>>> by a space character. Is that the goal?
>>>>
>>>> assuming it is... my advice is that you want to end up with
>>>> those two variables with the minimum of fuss and with a standard
>>>> PHP code style.
>>>>
>>>> list() with explode() is the most standard way of getting two
>>>> PHP variables from a simple delimited string:
>>>>
>>>> <?php
>>>> $num_and_text_separated_by_space = "311 Dell";
>>>> list($num,$text)=explode(' ', $num_and_text_separated_by_space);
>>>> echo $num;
>>>> echo $text;
>>>> ?>
>>>>
>>>> The equivalent of FMP
>>>> Left("text",2)
>>>>
>>>> in PHP is:
>>>> substr("text",0,2);
>>>>
>>>> you see here i just hard coded the number two to get the first
>>>> two characters of "text". FMP Left() is for getting left
>>>> characters. substr() is for getting any substring of characters.
>>>> substr() is way more flexible than FMP Left(). By changing the
>>>> parameters, it can also be used for FMP's Right() or Middle().
>>>> see the PHP manual for how to use it fully.
>>>>
>>>> so, when you ask, "what function should I be using inside "substr
>>>> ()" instead of the "strcspn()" function?" that is the wrong
>>>> question. the right question is: "what is the best, clearest way
>>>> to get my data from a space-delimited string into PHP variables?
>>>> the answer to that is list() with explode().
>>>>
>>>> yes, i would say that strcspn() is a specialty function. i
>>>> didn't say you shouldn't use it... i said you should have a good
>>>> reason to use it that outweighs the confusion it may cause you
>>>> or your colleagues down the road because it is an unusual usage
>>>> for what you are trying to do.
>>>>
>>>> so, the substr(Text, 0, strcspn(Text, " ")) function may seem to
>>>> work fine, but to the experienced PHP eye it is quite opaque. if
>>>> you want to write clear, concise code then consider using list()
>>>> with explode().
>>>>
>>>> cheers,
>>>> dan
>>>>
>>>>
>>>> On Aug 1, 2006, at 2:54 PM, AC wrote:
>>>>
>>>>> Not meaning to beat a dead horse here;
>>>>> - you said the equivalent of the FileMaker "Left()" function is
>>>>> the PHP "substr()" function
>>>>> - you also said the PHP "strcspn()" function is not a common
>>>>> function to use
>>>>> - I'm currently using substr(Text, 0, strcspn(Text, " "))
>>>>> - what function should I be using inside "substr()" instead of
>>>>> the "strcspn()" function? (I'm completely new to PHP so I
>>>>> assume I'm just missing the obvious answer)
>>>>>
>>>>>
>>>>>
>>>>> On Jul 31, 2006, at 11:41 AM, DC wrote:
>>>>>
>>>>>> well, strcspn() is another obscure function. i've been coding
>>>>>> PHP on a daily basis for several years now and i had to look
>>>>>> it up! it may have a specialized usage and you've certainly
>>>>>> demonstrated one interesting one ;-) it took me a minute to
>>>>>> wrap my head around that one.
>>>>>>
>>>>>> But, your best bet for code share-ability, maintainability and
>>>>>> readability is to know and explore the outer reaches of PHP
>>>>>> functions but when writing PHP to accomplish basic tasks, use
>>>>>> standard PHP idioms like list with explode. PHP offers
>>>>>> multiple paths to the same outcome but if you write code with
>>>>>> idiosyncratic idioms you're going to run into trouble down the
>>>>>> road - with other PHP coders and with your own memory.
>>>>>>
>>>>>> FYI, the equivalent to FMP's left() function in PHP is substr():
>>>>>>
>>>>>> http://us2.php.net/manual/en/function.substr.php
>>>>>>
>>>>>> Cheers and happy coding,
>>>>>> dan
>>>>>>
>>>>>> On Jul 28, 2006, at 8:04 PM, AC wrote:
>>>>>>
>>>>>>> Thanks Andrew & Dan,
>>>>>>>
>>>>>>> I had found both strtok() and list() with explode().
>>>>>>> I guess I'm still thinking in FileMaker terms when I'm doing
>>>>>>> things in PHP so I was looking for something like;
>>>>>>> Left(Text, NumOfChar) and Replace(Text, Start, Size,
>>>>>>> ReplacementText)
>>>>>>> I just figured since PHP had such an easy function to grab
>>>>>>> the remainder of the string (the equivalent of the FM Replace
>>>>>>> command) that it probably also had an easy equivalent of the
>>>>>>> FM Left command.
>>>>>>> Based on your answers I'm guessing it doesn't and the
>>>>>>> substr(Text, 0, strcspn(Text, " ")) command is the closest
>>>>>>> equivalent.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Jul 28, 2006, at 6:01 PM, DC wrote:
>>>>>>>
>>>>>>>> i would stay away from strtok()
>>>>>>>>
>>>>>>>> strtok() is a confusing function because it has an internal
>>>>>>>> stack that 'remembers' how many times you've called it and
>>>>>>>> then you have to call it the number of times that you have
>>>>>>>> strings to split.
>>>>>>>>
>>>>>>>> much better and more widely used and standard is to use this
>>>>>>>> construction using list() and explode()
>>>>>>>>
>>>>>>>> $variable = "311 something";
>>>>>>>> list($number,$word) = explode(' ',$variable);
>>>>>>>>
>>>>>>>> now you'll have two nicely named variables one that has the
>>>>>>>> number and one that has the word
>>>>>>>>
>>>>>>>> cheers,
>>>>>>>> dan
>>>>>>>>
>>>>>>>> On Jul 28, 2006, at 3:59 PM, Andrew Denman wrote:
>>>>>>>>
>>>>>>>>> Don't know about your first question, but for the second
>>>>>>>>> one, it looks like
>>>>>>>>> you want to break the string on the spaces. Check out
>>>>>>>>> strtok():
>>>>>>>>> http://us3.php.net/manual/en/function.strtok.php
>>>>>>>>>
>>>>>>>>> Andrew Denman
>>>>>>>>>
>>>>>>>>> -----Original Message-----
>>>>>>>>> From: fx.php_list-bounces at mail.iviking.org
>>>>>>>>> [mailto:fx.php_list-bounces at mail.iviking.org] On Behalf Of AC
>>>>>>>>> Sent: Friday, July 28, 2006 2:51 PM
>>>>>>>>> To: FX.php Discussion List
>>>>>>>>> Subject: [FX.php List] FMPHP API
>>>>>>>>>
>>>>>>>>> Anyone know if this API will grab both value fields from
>>>>>>>>> value lists
>>>>>>>>> that are based on 2 fields ex.
>>>>>>>>> The "Company" value list uses the fields "IDCompany" and
>>>>>>>>> "CompanyName".
>>>>>>>>> In FX only the IDCompany is returned.
>>>>>>>>> Does this API return both values?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Also, assuming I had MyVariable = "316 Dell"
>>>>>>>>> I can use the function strstr(MyVariable, " ")
>>>>>>>>> to get the "Dell" part by itself but to get the 316 I'm
>>>>>>>>> currently doing
>>>>>>>>> substr(MyVariable, 0, strcspn(MyVariable, " "))
>>>>>>>>> Is there an easier way to get the 316 by itself (assuming
>>>>>>>>> it could also
>>>>>>>>> be text)?
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> FX.php_List mailing list
>>>>>>>>> FX.php_List at mail.iviking.org
>>>>>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> FX.php_List mailing list
>>>>>>>>> FX.php_List at mail.iviking.org
>>>>>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> FX.php_List mailing list
>>>>>>>> FX.php_List at mail.iviking.org
>>>>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> FX.php_List mailing list
>>>>>>> FX.php_List at mail.iviking.org
>>>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>>
>>>>>> _______________________________________________
>>>>>> FX.php_List mailing list
>>>>>> FX.php_List at mail.iviking.org
>>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> FX.php_List mailing list
>>>>> FX.php_List at mail.iviking.org
>>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>
>>>> _______________________________________________
>>>> FX.php_List mailing list
>>>> FX.php_List at mail.iviking.org
>>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>
>>>>
>>>
>>> _______________________________________________
>>> FX.php_List mailing list
>>> FX.php_List at mail.iviking.org
>>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>
>> _______________________________________________
>> FX.php_List mailing list
>> FX.php_List at mail.iviking.org
>> http://www.iviking.org/mailman/listinfo/fx.php_list
>>
>>
>
> _______________________________________________
> FX.php_List mailing list
> FX.php_List at mail.iviking.org
> http://www.iviking.org/mailman/listinfo/fx.php_list
More information about the FX.php_List
mailing list