PHP Видаліть елементи з асоціативного масиву


100

У мене є масив 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]), але проблема полягає в тому, що іноді число індексу може бути різним.

Чи є спосіб їх видалити, зіставивши ім'я значення замість значення ключа?


не впевнений, чи розумію я тут питання? Що ви маєте на увазі, іноді число індексу може бути різним?
Саймон Н

Відповіді:


153

Ваш масив досить дивний: чому б не просто використовувати 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);

Навіть якщо зробити це можливо, це не так просто ... і я наполягаю: чи не можете ви змінити формат свого масиву, щоб працювати з більш простою системою ключ / значення?


Msgstr "Вам доведеться переосмислити всі елементи та проаналізувати значення". Коли ви використовуєте array_search, ви також можете шукати всі елементи.
Ніколя Аокі

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
Дякую, я шукав це лише.! :)
Раві Дхорія ツ

2
приємно і легко. просто шукаю це
Faisal Mehmood Awan

Це правдива відповідь, не те, що було перевірено.
А.Седдігі

16
$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]);
    }
}


3

Чому не використовувати 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);

Просто зауважте, що ваш масив буде перевстановлений.


1

Спробуйте це:

$keys = array_keys($array, "Completed");

/ edit Як ​​згадував JohnP, цей метод працює лише для вкладених масивів.


0

Спосіб для цього взяти вкладений цільовий масив і скопіювати його в один крок до вкладеного масиву. Видаліть ключ (и) і потім призначте остаточний обрізаний масив вкладеному вузлу попереднього масиву. Ось код для спрощення:

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

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

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

0

Я якось не згоден з прийнятою відповіддю. Іноді архітектура додатків не хоче, щоб ви возилися з ідентифікатором масиву або робить це незручним. Наприклад, я дуже багато використовую CakePHP, і запит до бази даних повертає первинний ключ як значення у кожному записі, дуже подібне до вище.

Якщо припустити, що масив не є тупо великим, я б використовував array_filter. Це створить копію масиву за вирахуванням записів, які ви хочете видалити, які ви можете призначити назад до вихідної змінної масиву.

Хоча це може здатися неефективним, насправді в моді дуже багато, щоб змінні були непорушними, і той факт, що більшість функцій масиву php повертає новий масив, а не фьюшинг з оригіналом, означає, що PHP начебто хоче, щоб ви це теж робили. І чим більше ви працюєте з масивами, і розумієте, наскільки складною і дратівливою є функція unset (), такий підхід має багато сенсу.

У будь-якому випадку:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Ви можете використовувати будь-яку логіку включення (наприклад, своє поле id) у вбудованій функції, яку ви хочете.


-1

для використання одного елемента масиву reset($item)


Функція скидання повинна використовуватися для переміщення внутрішнього вказівника масиву, а не для видалення елементів або скидання елементів з масиву. Використовуйте замість нього скинути. Якщо ваше рішення навіть працює, воно також має небажані побічні ефекти.
Девід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.