#23690 [Asn]: Config_Container::toArray() Bug + FIX :-)

From: Date: Mon, 19 May 2003 15:37:44 +0000
Subject: #23690 [Asn]: Config_Container::toArray() Bug + FIX :-)
References: 1  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-16471@lists.php.net to get a copy of this message
ID: 23690 User updated by: info at rhalff dot com Reported By: info at rhalff dot com Status: Assigned Bug Type: PEAR related Operating System: All PHP Version: 4.3.2RC3 Assigned To: mansion New Comment: Ok your right, with the test code I gave for reproduction of this bug the fix works. But if I change the type from 'inicommented' to 'inifile' the array will only contain 1 'extension'. Is this expected behaviour or a bug ? Previous Comments: ------------------------------------------------------------------------ [2003-05-19 10:11:22] info at rhalff dot com Ok.. my fix doesn't work either :| ------------------------------------------------------------------------ [2003-05-19 10:01:18] mansion@php.net > Hmm your fix will cause: > [PHP] > extension = bcmath.so > extension = bz2.so > extension = calendar.so > extension = cdpf.so > extension = crack.so > extension = curl.so Array ( [root] => Array ( [PHP] => Array ( [extension] => curl.so ) ) ) No it won't, you should test it. But I will wait to see if you can come up with a better solution before I commit anything. Let me know, Thanks. ------------------------------------------------------------------------ [2003-05-19 09:35:49] info at rhalff dot com Hmm your fix will cause: [PHP] extension = bcmath.so extension = bz2.so extension = calendar.so extension = cdpf.so extension = crack.so extension = curl.so Array ( [root] => Array ( [PHP] => Array ( [extension] => curl.so ) ) ) To me it seems the usage of [0] in the code is wrong. Since it can both mean the first character of a string as the first item in an array. For example try: $string = "Hi there"; echo $string[0]; $string[0] = "other value"; echo $string; I think the code should be something like this: 650: foreach ($newArr as $key => $value) { 651: if (isset($array[$this->name][$key])) { 652: // duplicate name/type if(!is_array($array[$this->name][$key])) { $old = $array[$this->name][$key]; unset($array[$this->name][$key]); $array[$this->name][$key][0] = $old; } $array[$this->name][$key][] = $value; 661: } else { 662: $array[$this->name][$key] = $value; 663: } 664: } I was wrong with the else part in my earlier code fix. Im not very sure my fix is good enough, so I will try to find if there is a better sollution. ------------------------------------------------------------------------ [2003-05-19 04:38:30] mansion@php.net Hi Rob, The problem with your solution is that it breaks this: require_once('Config.php'); $array['a']['b'][0]['foo']="value1"; $array['a']['b'][1]['foo']="value2"; $phpIni = new Config(); $root =& $phpIni->parseConfig($array, 'phparray'); echo '<pre>'; var_dump($root->toArray()); echo '</pre>'; Here is the solution I suggest instead: foreach ($newArr as $key => $value) { if (isset($array[$this->name][$key])) { // duplicate name/type if (!is_array($array[$this->name][$key]) || !isset($array[$this->name][$key][0])) { $old = $array[$this->name][$key]; unset($array[$this->name][$key]); $array[$this->name][$key][0] = $old; } $array[$this->name][$key][] = $value; } elseif (isset($array[$this->name][$key][0])) { $array[$this->name][$key][] = $value; } else { $array[$this->name][$key] = $value; } } Please let me know if this would make it for you. Thanks for the bug report. Bertrand Mansion Mamasam ------------------------------------------------------------------------ [2003-05-18 21:46:43] info at rhalff dot com Somewhat more readable code: Solution: Original Code: 650: foreach ($newArr as $key => $value) { 651: if (isset($array[$this->name][$key])) { 652: // duplicate name/type 653: if (!isset($array[$this->name][$key][0])) { 654: $old = $array[$this->name][$key]; 655: unset($array[$this->name][$key]); 656: $array[$this->name][$key][0] = $old; 657: } 658: $array[$this->name][$key][] = $value; 659: } elseif (isset($array[$this->name][$key][0])) { 660: $array[$this->name][$key][] = $value; 661: } else { 662: $array[$this->name][$key] = $value; 663: } 664: } Fixed Code: 650: foreach ($newArr as $key => $value) { 651: if (isset($array[$this->name][$key])) { 652: // duplicate name/type if(!is_array($array[$this->name][$key])) { $old = $array[$this->name][$key]; unset($array[$this->name][$key]); $array[$this->name][$key][0] = $old; } else { $array[$this->name][$key][] = $value; } 661: } else { 662: $array[$this->name][$key] = $value; 663: } 664: } ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/23690 -- Edit this bug report at http://bugs.php.net/?id=23690&edit=1

« previous php.pear.dev (#16471) next »