#23690 [Asn]: Config_Container::toArray() Bug + FIX :-)
| From: | info at rhalff dot com | 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