1

我正在使用以下代码,这一切似乎都很好。

$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
)

任何想法可能会出现什么问题以及如何解决?

4

1 回答 1

1

您正在与array_search()松散类型比较的默认行为发生冲突。在 PHP 中,当进行松散比较 ( ) 而不是严格比较 ( ) 时,任何字符串都被视为等于整数零=====

因此,在第二次替换时,PHP 认为'blue'与第一次替换大致相同0,并替换原来'black','orange'的位置0

var_dump('blue' == 0);
// bool(true)
var_dump('blue' === 0);
// bool(false)

要进行严格比较,请将其作为第三个参数array_search()传递。TRUE然后你会得到预期的结果。

$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
)
于 2015-05-09T21:01:36.337 回答