У меня есть массив PHP, который выглядит примерно так:
Index Key Value
[0] 1 Awaiting for Confirmation
[1] 2 Assigned
[2] 3 In Progress
[3] 4 Completed
[4] 5 Mark As Spam
Когда я var_dump значения массива, я получаю следующее:
array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }
Я хотел удалить " Завершено" и " Пометить как спам" . Я знаю, что могу unset[$array[3],$array[4])
, но проблема в том, что иногда порядковый номер может быть другим.
Есть ли способ удалить их, сопоставив имя значения вместо значения ключа?
Ответы:
Ваш массив довольно странный: почему бы просто не использовать
key
as index, аvalue
as ... значение?Не было бы намного проще, если бы ваш массив был объявлен так:
Это позволит вам использовать ваши значения в
key
качестве индексов для доступа к массиву ...И вы сможете использовать функции для поиска значений, например
array_search()
:Проще, чем с вашим массивом, не так ли?
Вместо этого с вашим массивом, который выглядит так:
Вам нужно будет перебрать все элементы, чтобы проанализировать
value
и отключить нужные элементы:Даже если это возможно, все не так просто ... и я настаиваю: нельзя ли изменить формат вашего массива, чтобы работать с более простой системой ключ / значение?
источник
источник
Для 2D-массивов ...
источник
Вы можете использовать это
источник
Почему не использовать array_diff?
Просто обратите внимание, что ваш массив будет переиндексирован.
источник
Попробуй это:
/ edit Как упоминалось JohnP, этот метод работает только для невложенных массивов.
источник
Способ сделать это - взять ваш вложенный целевой массив и скопировать его за один шаг во невложенный массив. Удалите ключ (и), а затем назначьте окончательный обрезанный массив вложенному узлу более раннего массива. Вот код для упрощения:
источник
Я не согласен с принятым ответом. Иногда архитектура приложения не хочет, чтобы вы возились с идентификатором массива, или делает это неудобным. Например, я довольно часто использую CakePHP, и запрос к базе данных возвращает первичный ключ как значение в каждой записи, очень похожее на приведенное выше.
Предполагая, что массив не слишком большой, я бы использовал array_filter. Это создаст копию массива за вычетом записей, которые вы хотите удалить, которые вы можете присвоить обратно исходной переменной массива.
Хотя это может показаться неэффективным, на самом деле в наши дни очень модно иметь неизменяемые переменные, и тот факт, что большинство функций массива php возвращают новый массив, а не заигрывают с оригиналом, подразумевает, что PHP вроде как хочет, чтобы вы тоже это делали. И чем больше вы работаете с массивами и понимаете, насколько сложна и раздражает функция unset (), этот подход приобретает большой смысл.
Тем не мение:
Вы можете использовать любую логику включения (например, ваше поле id) во встроенной функции, которую хотите.
источник
для использования одного элемента массива
reset($item)
источник