Существует ли встроенный способ извлечения элемента массива PHP таким образом, чтобы он удалялся из массива?

#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()

2. php.net/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() решения? Я разочарован: P

2. Хороший момент. Это работает в любом случае, пока значение уникально, но отредактировано, потому что, вероятно, этого не будет. Я мог бы сделать array_column() , но не имел бы особого смысла 😉