У меня есть PHP-массив, который выглядит примерно так:
Index Key Value [0] 1 Awaiting for Confirmation [1] 2 Asssigned [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) "Asssigned" } [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" } }
Я хотел удалить «Завершено» и «Отметить как спам». Я знаю, что могу отменить [$ array [3], $ array [4]) будет делать трюк. Но проблема в том, что когда-нибудь номер индекса может быть другим, поэтому есть ли способ удалить «завершенный» и «Mark As Spam», сопоставив имя значения?
Большое спасибо заранее
Ваш массив довольно странный: почему бы просто не использовать 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);
с$indexCompleted = array_search('Completed', $array); unset($array[$indexCompleted]); $indexSpam = array_search('Mark As Spam', $array); unset($array[$indexSpam]); var_dump($array);
с$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);
сforeach ($array as $index => $data) { if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') { unset($array[$index]); } } var_dump($array);
Даже если делать, это не так просто … и я настаиваю: не можете ли вы изменить формат своего массива, работать с более простой системой key / value?
... $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;
с$temp_array = $list['resultset'][0]; unset($temp_array['badkey1']); unset($temp_array['badkey2']); $list['resultset'][0] = $temp_array;
с$temp_array = $list['resultset'][0]; unset($temp_array['badkey1']); unset($temp_array['badkey2']); $list['resultset'][0] = $temp_array;
для одиночного массива Возврат к использованию reset($item)
Вы можете использовать это
unset($dataArray['key']);