我正在使用以下代码,这一切似乎都很好。
$colors = array('red', 'yellow', 'blue');
$replacements = array('yellow' => array(1, 1), 'blue' => array('black','orange'));
foreach ($replacements as $color => $replace) {
$position = array_search($color, $colors);
array_splice($colors, $position, 1, $replace);
}
$ colors的结果:
Array
(
[0] => red
[1] => 1
[2] => 1
[3] => black
[4] => orange
)
现在,我遇到了这个问题。如果我只是将$ replacements数组更改为以下(注意黄色数组值已更改):
$replacements = array('yellow' => array(0, 1), 'blue' => array('black','orange'));
然后再次运行代码我得到以下不良结果:
Array
(
[0] => red
[1] => black
[2] => orange
[3] => 1
[4] => blue
)
上面的结果不是我所期待的。当传递零(0)值时,array_splice函数似乎存在某种问题。
期望的结果如下:
Array
(
[0] => red
[1] => 0
[2] => 1
[3] => black
[4] => orange
)
任何可能出错的想法以及如何解决这个问题?
答案 0 :(得分:1)
你正在违反array_search()
松散类型比较的默认行为。在PHP中,any string is considered equal to integer zero进行松散比较(==
)而不是严格(===
)。
所以在第二次替换时,PHP看到'blue'
与第一次替换0
松散等于'black','orange'
,并替换0
所在的var_dump('blue' == 0);
// bool(true)
var_dump('blue' === 0);
// bool(false)
。
TRUE
要严格比较array_search()
,请将$colors = array('red', 'yellow', 'blue');
$replacements = array('yellow' => array(0, 1), 'blue' => array('black','orange'));
foreach ($replacements as $color => $replace) {
// Use a strict comparison with TRUE as the 3rd arg
$position = array_search($color, $colors, TRUE);
array_splice($colors, $position, 1, $replace);
}
print_r($colors);
Array
(
[0] => red
[1] => 1
[2] => 0
[3] => black
[4] => orange
)
作为其第三个参数。然后,您将获得预期的结果。
/usr/lib/php/extensions/no-debug-non-zts-20121212