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

From: Date: Tue, 07 Jun 2005 09:57:27 +0000
Subject: Re: Re: PHP bug within multi. dimensional arrays?
References: 1 2  Groups: php.general 
Request: Send a blank email to php-general+get-216545@lists.php.net to get a copy of this message
Matthew Weier O'Phinney wrote:
* Merlin <news.groups@web.de>:
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
        }
    }


« previous php.general (#216545) next »