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 では、厳格な比較 ( ) ではなく緩やかな比較 ( ) を行う場合、文字列は整数のゼロと等しいと見なされます=====

そのため、2 回目の置換では、PHP は最初の置換と'blue'大まかに等しいと見なし、あった場所を置換します。0'black','orange'0

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

array_search()厳密に比較するには、3 番目のパラメーターとして渡します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 に答える