Начиная с PHP 7.3, `array_unshift ()` может вызываться только с одним параметром. В чем смысл? - PullRequest
4 голосов
/ 10 июля 2020

Как сказано в руководстве PHP о array_unshift() функции:

7.3.0 Теперь эту функцию можно вызывать только с одним параметром. Раньше требовалось как минимум два параметра.

Я не понял. Как использовать такую ​​функцию с одним параметром?

Пытался угадать, но ничего не вышло:

$arr = ['one' => 'test', 'two' => 'some'];
array_unshift($arr);
print_r($arr);

// Result:
// Array
// (
//    [one] => test
//    [two] => some
// )

$arr1 = ['what', 'ever'];
array_unshift($arr1);
print_r($arr1);

// Array
// (
//    [0] => what
//    [1] => ever
// )

Массивы не изменились.

Кто-нибудь знает что именно предлагают PHP участники?

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Думаю, моему комментарию может потребоваться дополнительное пояснение, надеюсь, это сделает его более понятным.

Если у меня есть два массива, и я хочу добавить все элементы со второго до конца первого, используя array_push в сочетании с оператором распаковки позволяет мне сделать это следующим образом:

$a = [1, 2, 3];
$b = [4, 5, 6];

array_push($a, ...$b);

$a теперь [1, 2, 3, 4, 5, 6]

(array_unshift позволяет мне сделать то же самое, но добавить элементы в начало массива вместо этого. Использование array_push, я думаю, делает пример более понятным)

До PHP 7.3, если $b был пустым, тогда будет выдано предупреждение, так как при распаковке пустого массива эквивалентен передаче только первого аргумента. См. Демонстрацию здесь: https://3v4l.org/GZQoo. $a все равно останется без изменений, что является желаемым результатом, так что это просто ненужный шум в журналах.

В практическом примере, если $b генерируется другой функцией (вызовом базы данных и т. c), то без этого изменения мне нужно было бы позвонить if (!empty($b) ... перед запуском кода, чтобы предотвратить предупреждение. Теперь он работает беззвучно.

Примечание. Существуют и другие способы добавления массива к другому (array_merge, array_replace и оператор +), но все они имеют определенные способы слияния и удаления -дублирование общих ключей. Этот метод просто добавляет все значений второго к первому, независимо от ключей.

1 голос
/ 10 июля 2020

Это просто предположение, но когда функция вернет:

Возвращает новое количество элементов в массиве.

вы можете использовать его как count альтернатива:

$arr1 = ['what', 'ever'];
print_r(array_unshift($arr1));    // 2

Но, конечно, это не очевидно.

В качестве еще одного побочного эффекта из руководства:

Все ключи числового массива будут изменены, чтобы начать подсчет с нуля

Итак, это частичная замена array_values:

$arr1 = [4 => 'what', 5 => 'ever'];
array_unshift($arr1);
print_r($arr1);  // [[0] => what [1] => ever]

И это тоже не очевидно.

Также, возможно, это объяснят другие ответы поведение лучше.

Кроме того, благодаря @NigelRen, в официальном руководстве вы можете прочитать, что

array_push() и array_unshift() теперь также можно вызывать с одним аргументом, что особенно удобно по отношению к оператор распространения.

Итак, вы можете использовать что-то вроде:

$arr1 = [['what'], ['ever']];
array_unshift(...$arr1);
print_r($arr1);

Но поведение этого метода очень странное o_O:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => ever
                )

            [1] => what
        )

    [1] => Array
        (
            [0] => ever
        )

)
...