PHP удаляет элементы из ассоциативного массива
у меня есть 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])
, но проблема в том, что иногда число индексов может быть различным.
есть ли способ удалить их, сопоставив имя значения вместо значения ключа?
8 ответов:
Ваш массив довольно странно:почему бы просто не использовать
key
как индекс, а тоvalue
как... значение ?не было бы намного проще, если бы Ваш массив был объявлен следующим образом :
$array = array( 1 => 'Awaiting for Confirmation', 2 => 'Asssigned', 3 => 'In Progress', 4 => 'Completed', 5 => 'Mark As Spam', );
это позволит вам использовать ваши значения
key
индексы для доступа к массиву...и вы сможете использовать функции для поиска по значениям, таким
as array_search()
:$indexCompleted = array_search('Completed', $array); unset($array[$indexCompleted]); $indexSpam = array_search('Mark As Spam', $array); unset($array[$indexSpam]); var_dump($array);
легче чем с такими, нет ?
вместо этого, с вашим массивом, который выглядит так:
$array = array( array('key' => 1, 'value' => 'Awaiting for Confirmation'), array('key' => 2, 'value' => 'Asssigned'), array('key' => 3, 'value' => 'In Progress'), array('key' => 4, 'value' => 'Completed'), array('key' => 5, 'value' => 'Mark As Spam'), );
вам придется перебирать все элементы, чтобы проанализировать
value
, и снимите правильные элементы:foreach ($array as $index => $data) { if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') { unset($array[$index]); } } var_dump($array);
даже если это возможно, это не так просто... и я настаиваю: вы не можете изменить формат вашего массива, чтобы работать с более простой системой ключей/значений ?
... $array = array( 1 => 'Awaiting for Confirmation', 2 => 'Asssigned', 3 => 'In Progress', 4 => 'Completed', 5 => 'Mark As Spam', ); return array_values($array); ...
$key = array_search("Mark As Spam", $array); unset($array[$key]);
для 2D массивов...
$remove = array("Mark As Spam", "Completed"); foreach($arrays as $array){ foreach($array as $key => $value){ if(in_array($value, $remove)) unset($array[$key]); } }
попробуйте это:
$keys = array_keys($array, "Completed");
/ edit Как уже упоминалось JohnP, этот метод работает только для не вложенных массивов.
почему не использовать array_diff?
$array = array( 1 => 'Awaiting for Confirmation', 2 => 'Asssigned', 3 => 'In Progress', 4 => 'Completed', 5 => 'Mark As Spam', ); $to_delete = array('Completed', 'Mark As Spam'); $array = array_diff($array, $to_delete);
просто обратите внимание, что Ваш массив будет переиндексирован.
способ сделать это, чтобы взять вложенный целевой массив и скопировать его в один шаг в не вложенный массив. Удалите ключ(ы), а затем назначьте окончательный обрезанный массив вложенному узлу более раннего массива. Вот код, чтобы сделать его простым:
$temp_array = $list['resultset'][0]; unset($temp_array['badkey1']); unset($temp_array['badkey2']); $list['resultset'][0] = $temp_array;