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" } }
Я хотел удалить Completed и Mark As Spam. Я знаю, что могу unset[$array[3],$array[4])
, но проблема в том, что иногда номер индекса может быть другим.
Есть ли способ удалить их, сопоставляя имя значения вместо значения ключа?
Ответы
Ответ 1
Ваш массив довольно странный: почему бы просто не использовать key
качестве индекса, а value
качестве... значения?
Не было бы намного проще, если бы ваш массив был объявлен так:
$array = array(
1 => 'Awaiting for Confirmation',
2 => 'Asssigned',
3 => 'In Progress',
4 => 'Completed',
5 => 'Mark As Spam',
);
Это позволит вам использовать ваши значения key
качестве индексов для доступа к массиву...
И вы сможете использовать функции для поиска по значениям, такие как 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);
Даже если это выполнимо, это не так просто... и я настаиваю: не можете ли вы изменить формат вашего массива, чтобы работать с более простой системой ключ/значение?
Ответ 2
...
$array = array(
1 => 'Awaiting for Confirmation',
2 => 'Asssigned',
3 => 'In Progress',
4 => 'Completed',
5 => 'Mark As Spam',
);
return array_values($array);
...
Ответ 3
$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]);
}
}
Ответ 4
Вы можете использовать этот
unset($dataArray['key']);
Ответ 5
Почему бы не использовать 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);
Обратите внимание, что ваш массив будет переиндексирован.
Ответ 6
Попробуйте следующее:
$keys = array_keys($array, "Completed");
/редактировать
Как упоминалось JohnP, этот метод работает только для не вложенных массивов.
Ответ 7
Способ сделать это, чтобы взять ваш вложенный целевой массив и скопировать его в один шаг на не-вложенный массив.
Удалите ключ (ов), а затем назначьте окончательный обрезанный массив вложенному node более раннего массива.
Вот код, чтобы сделать его простым:
$temp_array = $list['resultset'][0];
unset($temp_array['badkey1']);
unset($temp_array['badkey2']);
$list['resultset'][0] = $temp_array;
Ответ 8
Я вроде не согласен с принятым ответом. Иногда архитектура приложения не хочет, чтобы вы связывались с идентификатором массива, или делает его неудобным. Например, я довольно часто использую CakePHP, и запрос к базе данных возвращает первичный ключ в качестве значения в каждой записи, очень похожий на описанный выше.
Предполагая, что массив не слишком большой, я бы использовал array_filter. Это создаст копию массива, за исключением записей, которые вы хотите удалить, которые вы можете присвоить исходной переменной массива.
Хотя это может показаться неэффективным, в наши дни очень популярно, чтобы переменные были неизменяемыми, и тот факт, что большинство функций массива php возвращают новый массив, а не сливаются с оригиналом, подразумевает, что PHP тоже хочет, чтобы вы делали это тоже. И чем больше вы работаете с массивами и понимаете, насколько сложна и раздражает функция unset(), этот подход имеет большой смысл.
Тем не мение:
$my_array = array_filter($my_array,
function($el) {
return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam";
});
Вы можете использовать любую логику включения (например, ваше поле идентификатора) во встроенной функции, которую вы хотите.
Ответ 9
для одного массива Использование элемента reset($item)