Jim Lucas wrote:
> PJ wrote:
>> Jim Lucas wrote:
>>> PJ wrote:
>>>> foreach does a nice job if you want the results identical each time.
>>>> What can you use to change the formatting of the results dependent on
>>>> the number of results.
>>>> Here's an example:
>>>> foreach ( $authors[$bookID] AS $authorID => $authorData ) {
>>>> # Display the
>>>> echo "{$authorData['first_name']}
>>>> {$authorData['last_name']}\n";
>>>> }
>>>>
>>>> will echo - Joe Boe John Blue Andy Candy etc depending on how many
>>>> rows
>>>> we have.
>>>> What I want is: Joe Boe, John Blue, Andy Candy & Hans Stick (
>>>> separated
>>>> by commas, except for the last one which is separated with & .
>>>> I thought of passing a variable to the foreach and then using if
>>>> elseif... but that can't work because the variable is reset to 0 after
>>>> each pass.
>>>> Can't get switch to do it (maybe I don't understand it right.
>>>> Help ?
>>>>
>>> your answer lies with not replacing foreach to make your life/output
>>> better. But with how the data is prepared and handed off to the
>>> foreach statement.
>>>
>>> I am guessing that what you want would be something like this.
>>>
>>> Since this looks like a snippet of code I sent you the other day, I
>>> will snag it "complete" from the other thread.
>>>
>>> <?php
>>>
>>> ...
>>>
>>> # Test to see if the book has any authors
>>> if ( isset($authors[$bookID]) ) {
>>>
>>> # Tell us how many authors we found
>>> echo 'Found: ', count($author[$bookID]), ' authors';
>>>
>>> # Create an array that will hold the output from the DB.
>>> $aList = array();
>>> # Loop through the authors
>>> foreach ( $authors[$bookID] AS $authorID => $authorData ) {
>>> # Add all the authors to that new array
>>> $aList[] = "{$authorData['last_name']},
>>> {$authorData['first_name']}";
>>> }
>>>
>>> # Sanitize the output
>>> $aList = array_map('htmlspecialchars', $aList);
>>>
>>> # Get a count of how many authors their is.
>>> $tAuthors = count($aList);
>>>
>>> # If more then one, do...
>>> if ( $tAuthors > 1 ) {
>>> # Take the last one off, so we can handle it
>>> differently
>>> $last_author = array_pop($aList);
>>> echo join(', ', $aList), ' & ', $last_author;
>>>
>>> # If only one, then do...
>>> } elseif ( $tAuthors == 1 ) {
>>> echo join('', $aList);
>>> }
>>> echo '<br />';
>>> } else {
>>> echo 'No authors found';
>>> }
>>>
>>>
>>> ...
>>>
>>> ?>
>>>
>> Hi Jim,
>> Please excuse my writing to you directly. If you don't think it's
>> proper, just let me know & I'll swing off.
>
> No problem with hitting me directly, but your findings could be of use
> to others
> since it is cleaner way of solving your problem.
>
> So, on the list we go....
>
>> So, while I have your attention and if you have a moment, I found this
>> interesting possibility: someone threw "implode()" at me and I looked it
>> up in the php manual and hey, found and interesting little function:
>>
>> function ImplodeProper($arr, $lastConnector = ' & ')
>> {
>> if( !is_array($arr) or count($arr) == 0) return '';
>> $last = array_pop($arr);
>> if(count($arr))
>> return implode(', ',$arr).", $lastConnector $last";
>> else
>> return $last;
>> }
>>
>> Since my limited understanding of php impedes me to implement it
>> experimentally in my application, I was curious if, indeed, it could be
>> another option. It does look to me like it could work, but it would
>> require a slightly different implementation of the query, probably
>> somehow using something like a CONCAT(first_name, " ", last_name). Am I
>> learning something here or is this the wrong tree to bark up?
>>
>
> This would be a very nice way to clean up the code
>
> Although you could do something with CONCAT(), I would suggest leaving
> the code as is.
>
> Data is all that you want to get from MYSQL, not format.
>
> Basically, take the above function and place it in a lib you include
> for everything. Then replace the if/then/else statement that I built
> for you with a
> call to said function.
>
> <?php
>
> ...
> function ImplodeProper($arr, $lastConnector = ' & ')
> {
> if( !is_array($arr) or count($arr) == 0) return '';
> $last = array_pop($arr);
> if(count($arr))
> return implode(', ',$arr).", $lastConnector $last";
> else
> return $last;
> }
> ...
>
> # Test to see if the book has any authors
> if ( isset($authors[$bookID]) ) {
>
> # Tell us how many authors we found
> echo 'Found: ', count($author[$bookID]), ' authors';
>
> # Create an array that will hold the output from the DB.
> $aList = array();
> # Loop through the authors
> foreach ( $authors[$bookID] AS $authorID => $authorData ) {
> # Add all the authors to that new array
> $aList[] = "{$authorData['last_name']},
> {$authorData['first_name']}";
> }
>
> # Sanitize the output
> $aList = array_map('htmlspecialchars', $aList);
>
> echo implodeProper($aList), '<br />';
>
> } else {
> echo 'No authors found';
> }
>
> ...
>
> ?>
>
> That would do the trick.
>
Sure did. Just have to remove the comma from the line:
return implode(', ',$arr).", $lastConnector $last"; this give the
last pair of names a separator of , & which is not kosher English - it
should be:
return implode(', ',$arr)." $lastConnector $last";
I had copied the function as is. :-)
--
unheralded genius: "A clean desk is the sign of a dull mind. "
-------------------------------------------------------------
Phil Jourdan --- [email protected]
http://www.ptahhotep.com
http://www.chiccantine.com/andypantry.php
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php