У меня есть массив PHP следующим образом:
$messages = [312, 401, 1599, 3, ...];
Я хочу удалить элемент, содержащий значение $del_val
(например, $del_val=401
), но я не знаю его ключ. Это может помочь: каждое значение может быть там только один раз .
Я ищу простейшую функцию для выполнения этой задачи, пожалуйста.
Ответы:
Используя
array_search()
иunset
, попробуйте следующее:array_search()
возвращает ключ найденного элемента, который можно использовать для удаления этого элемента из исходного массива с помощьюunset()
. Он вернетсяFALSE
при неудаче, однако при успехе может вернуть значение false-y (ваш ключ может быть,0
например), поэтому используется!==
оператор строгого сравнения .Оператор
if()
проверит,array_search()
вернулось ли значение, и выполнит действие, только если он это сделал.источник
array_diff()
будет медленнее , поскольку это сравнение двух массивов, а не просто поиск по одному , какarray_search()
.$key
есть0
?0
искомое значение имеет ключ или любое другое значение Falsey, оно не будет сбрасывать значение и ваш код не будет работать. Вы должны проверить$key === false
. (отредактировал - ты понял)Что ж, удаление элемента из массива в основном просто устанавливает разницу с одним элементом.
Это хорошо обобщает, вы можете удалить столько элементов, сколько хотите одновременно, если хотите.
Отказ от ответственности: обратите внимание, что мое решение создает новую копию массива, сохраняя при этом старый нетронутым в отличие от принятого ответа, который изменяется. Выберите тот, который вам нужен.
источник
[$element]
, что я использовалarray($element)
вместо этого. Не важно, но просто хотел, чтобы любой, у кого была похожая проблема, знал, что они не одниarray_diff
используется(string) $elem1 === (string) $elem2
как условие равенства,$elem1 === $elem2
а не так, как вы могли бы ожидать. Проблема, на которую указывает @ nischayn22, является следствием этого. Если вы хотите, чтобы что-то использовалось в качестве служебной функции, которая будет работать для массивов произвольных элементов (которые могут быть объектами), ответ Bojangle может быть лучше по этой причине.array_diff()
и, таким образом, подталкивает время выполнения до O (n lg n) из O (n).Один интересный способ заключается в использовании
array_keys()
:array_keys()
Функция принимает два дополнительных параметра , чтобы возвращать только ключи для конкретного значения и требуется ли проверка строгая (т.е. с использованием === для сравнения).Это также может удалить несколько элементов массива с одинаковым значением (например
[1, 2, 3, 3, 4]
).источник
array_values()
; оставшиеся ключи все еще находятся в том же порядке, так что технически это не «несортировано»Если вы точно знаете, что ваш массив будет содержать только один элемент с этим значением, вы можете сделать
Однако, если ваше значение может встречаться в массиве более одного раза, вы можете сделать это
Примечание: Второй вариант работает только для PHP5.3 + с Closures
источник
источник
Посмотрите на следующий код:
Ты можешь сделать:
И это даст вам этот массив:
источник
Лучший способ это
array_splice
Причина для Лучшего находится здесь в http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
источник
[1, 2, 4 => 3]
.3
, массив будет[1, 2, 3]
; другими словами, значение не было удалено. Чтобы быть ясным, я не говорю, что это терпит неудачу во всех сценариях, только этот.Или просто ручным способом:
Это самый безопасный из них, потому что у вас есть полный контроль над вашим массивом
источник
array_splice()
вместоunset()
будет также переупорядочивать индексы массива, что может быть лучше в этом случае.С помощью следующего кода повторяющиеся значения будут удалены из сообщений $.
$messages = array_diff($messages, array(401));
источник
Если у вас есть PHP
5.3+
, есть однострочный код:источник
$value
, поэтому на самом деле его нужно поместить в мини-класс, чтобы вы могли получить доступ$value
к закрытию ....Вывод
Array ( [0] => 312 [1] => 1599 [2] => 3 )
источник
ты можешь сделать:
Объяснение : Удалить элемент, имеющий ключ,
401
после переворачивания массива.источник
401
?Чтобы удалить несколько значений, попробуйте следующее:
источник
Заимствовал логику underscore.JS _.reject и создал две функции (люди предпочитают функции !!)
array_reject_value: эта функция просто отклоняет указанное значение (также работает для PHP 4,5,7)
array_reject: эта функция просто отклоняет вызываемый метод (работает для PHP> = 5.3)
Таким образом, в нашем текущем примере мы можем использовать вышеуказанные функции следующим образом:
или даже лучше: (поскольку это дает нам лучший синтаксис для использования, как у array_filter )
Выше можно использовать для более сложных вещей, например, скажем, мы хотели бы удалить все значения, которые больше или равны 401, мы могли бы просто сделать это:
источник
Попробуйте это, это лучший и самый быстрый способ удалить элемент по значению
источник
Ответ @ Bojangles помог мне. Спасибо.
В моем случае массив может быть ассоциативным или нет, поэтому я добавил следующую функцию
С уважением
источник
однострочный код (благодаря array_diff () ), используйте следующее:
источник
Принятый ответ преобразует массив в ассоциативный массив, поэтому, если вы хотите сохранить его в качестве неассоциативного массива с принятым ответом, вам, возможно, придется его использовать
array_values
.Ссылка здесь
источник
Согласно вашему требованию « каждое значение может быть там только один раз », если вы просто заинтересованы в сохранении уникальных значений в вашем массиве, то это
array_unique()
может быть то, что вы ищете.Входные данные:
Результат:
источник
Если значения, которые вы хотите удалить, находятся или могут быть в массиве. Используйте функцию array_diff . Кажется, отлично работает для таких вещей.
array_diff
источник
Я знаю, что это совсем не эффективно, но просто, интуитивно понятно и легко читается.
Так что, если кто-то ищет не очень интересное решение, которое можно расширить для работы с большим количеством значений или с более конкретными условиями ... вот простой код:
источник
Получить ключ массива с
array_search()
.источник
Если вы не знаете его ключ, значит, он не имеет значения.
Вы можете поместить значение в качестве ключа, это означает, что оно мгновенно найдет значение. Лучше, чем использовать поиск по всем элементам снова и снова.
источник
Однострочник с использованием
or
оператора:источник
Вы можете сослаться на этот URL : для функции
Тогда вывод должен быть,
источник
Другая идея, чтобы удалить значение массива, использовать array_diff. Если я захочу
(Док .: http://php.net/manual/fr/function.array-diff.php )
источник
Я думаю, что самым простым способом было бы использовать функцию с циклом foreach:
Выход будет:
источник
В PHP 7.4 с использованием функций стрелок:
Чтобы сохранить его в неассоциативном массиве, оберните его
array_values()
:источник