функция — PHP array_splice внутри цикла не работает должным образом

Я использую следующий код, и все кажется хорошо в этом немного.

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

Есть идеи, что может пойти не так и как это можно исправить?

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector