#php #arrays
#php #массивы
Вопрос:
Существует ли встроенный способ извлечения элемента массива PHP таким образом, чтобы он удалялся из массива? Аналогично array_pop()
, но с определенным индексом? Например:
<?php
$array = [
'foo' => 123,
'bar' => 456,
'baz' => 789
];
$bar = array_get_and_remove($array, 'bar');
/* Outputs:
* $bar = 456,
* $array = ['foo' => 123, 'baz' => 789]
*/
Комментарии:
1. Вы можете использовать
array_splice()
3.
array_splice()
работает только для числовых индексов?4. Ну, это работает со смещением ключа, поэтому, если у вас есть строковый ключ, вы просто ищете его, чтобы получить смещение с
array_search()
.5. Должно было быть проще, чем
array_splice()
🙂
Ответ №1:
$element = $array[$key];
unset($array[$key]);
Итак, чтобы создать вашу функцию (обязательно используйте ссылку amp;
):
function array_get_and_remove(amp;$array, $key);
$element = $array[$key];
unset($array[$key]);
return $element;
}
Затем:
$bar = array_get_and_remove($array, 'bar');
Комментарии:
1. Черт возьми, я перегружаю свой!
Ответ №2:
Нет ни одной встроенной функции. Ааммад Улла сразу перешел к нему, пока я его перегружал, но вот простой способ. $result
будет содержать 'bar' => 456
и будет удален из $array
:
$array = array_diff_key($array, $result = ['bar' => $array['bar']]);
- Назначить
'bar' => $array['bar']
массив для$result
- Вычислить разницу массива и
$result
Использование array_splice()
:
$result = array_splice($array, array_search('bar', array_keys($array), true), 1);
- Получить массив строковых ключей
array_keys()
- Выполните поиск в этом массиве для
bar
возврата числового ключа / смещенияarray_search()
- Используйте это смещение и длину
1
, чтобы удалить этот элемент и вернуть егоarray_splice()
Чтобы получить только значение, используйте что-то вроде current()
:
$result = current(array_splice($array, array_search('bar', array_keys($array), true), 1));
Комментарии:
1. Я думаю, вы хотите использовать
array_diff_key()
, чтобы он получал разницу на основе ключа, а не значения. Также нетarray_column()
решения? Я разочарован: P2. Хороший момент. Это работает в любом случае, пока значение уникально, но отредактировано, потому что, вероятно, этого не будет. Я мог бы сделать
array_column()
, но не имел бы особого смысла 😉