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 83

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);

просто обратите внимание, что Ваш массив будет переиндексирован.

вы можете использовать этот

unset($dataArray['key']);

способ сделать это, чтобы взять вложенный целевой массив и скопировать его в один шаг в не вложенный массив. Удалите ключ(ы), а затем назначьте окончательный обрезанный массив вложенному узлу более раннего массива. Вот код, чтобы сделать его простым:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

для одного элемента массива использовать reset($item)