Re: Re: PHP bug within multi. dimensional arrays?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Matthew Weier O'Phinney wrote:
* Merlin <news.groups@xxxxxx>:

Hi there,

I am outputting an multidim. array. That works fine, except one thing. The first letter of the value inside dimension 1 always gets printed.

For example:

I fill the arrays:
while ($row = mysql_fetch_object($result)){		
	$cat[$row->main_id][name] 		= $row->main_name;	
	$cat[$row->main_id][$row->sub_id][name] = $row->sub_name;			
}


First off, if you're creating associative arrays, you should quote the
keys:

    $cat[$row->main_id]['name'] = $row->main_name;

If you don't do so, PHP assumes you're using a constant value for the
key name.


Then I output them:
foreach ($cat AS $maincat){
	echo $maincat[name].':';


Quote your keys!


	foreach($maincat AS $subcat){


You do realize that the above will also loop over the index 'name',
right?...


		echo $subcat[name].$br;


and since it does, the first element in that array is 'name', which
isn't an array, but a string. Since the 'name' constant isn't defined,
it will interpret that as 'true', or 1, and so it takes the first
character of that string.

I think you'll find the 'name' constant evaluates to FALSE, which in turn
casts to zero, which will give you the first element of the given array,
but as you pointed out its a string not an array so you get the first
char (because php allows array-like access to the individual chars in
a string) ... if it had evaluated to TRUE you would be getting the second
char.

the rest of your explaination is spot on.



	}
	echo $br;
}

Which does result in:

Europe:E
Germany
UK

North America:N
US
CA

As you can see I get the extra letters N and E. Is this an php error or did I do something wrong?


So, what you should probably do is create an additional layer in your
multi-dimensional array for the subcategories, and have it of the form
sub_id => sub_name:

 	$cat[$row->main_id]['subs'][$row->sub_id] = $row->sub_name;	

Then loop over that:

    foreach ($cat as $main_cat) {
        echo $maincat['name'] . ":\n";
        foreach ($maincat['subs'] as $sub_id => $sub_name) {
            echo "$sub_name$br"; // could also use $sub_id here if
                                 // desired
        }
    }


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux