Я использую следующий код, и все кажется хорошо в этом немного.
$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
)
Результат выше не то, что я ожидаю. Кажется, что функция array_splice имеет какую-то проблему, когда передается значение ноль (0).
Желаемый результат будет следующим:
Array
(
[0] => red
[1] => 0
[2] => 1
[3] => black
[4] => orange
)
Есть идеи, что может пойти не так и как это можно исправить?
Вы бежите из 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
)
Других решений пока нет …