[FX.php List] FMPHP API

Steve Hannah shannah at sfu.ca
Tue Aug 1 16:22:26 MDT 2006


> 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()

There is a third option in this case:

$string_to_parse ="12 My Company Name";
$pos = strpos($string_to_parse, ' ');
$num = substr($string_to_parse, 0, $pos);
$text = substr($string_to_parse, $pos+1);


Best regards

Steve
----------------------------------------
Steve Hannah
Web Services Developer

Faculty of Applied Sciences
Simon Fraser University
shannah at sfu.ca
604-268-7228
Homepage: http://www.sjhannah.com
--
Need to build a database driven web application quickly?
Try Dataface: http://fas.sfu.ca/dataface



On 1-Aug-06, at 2: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
>



More information about the FX.php_List mailing list