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" } }

CompletedおよびMark As Spamを削除したかった。できることunset[$array[3],$array[4])はわかっていますが、問題は、インデックス番号が異なる場合があることです。

キー値の代わりに値名を照合することでそれらを削除する方法はありますか?


私がここで手元にある質問を理解しているかどうかわかりませんか?インデックス番号が異なる場合があるとはどういう意味ですか?
Simon H

回答:


153

あなたの配列はかなり奇妙です:なぜkeyasインデックスとvalueas ...値を使わないのですか?

配列が次のように宣言されていれば、はるかに簡単ではないでしょうか。

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

たとえ実行可能であっても、それはそれほど単純ではありません...そして私は主張します:より単純なキー/値システムで動作するように配列の形式を変更できないのですか?


「値を分析するには、すべてのアイテムをループする必要があります」。array_searchを使用している場合は、すべてのアイテムを検索することもできます。
Nicolas Aoki、


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

受け入れられた答えにはちょっと同意しません。アプリケーションアーキテクチャによっては、配列IDをいじったり、不便にさせたりすることが望ましくない場合があります。たとえば、私は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)


reset関数は、配列から項目を削除したり、設定を解除したりするのではなく、内部配列ポインターを移動するために使用する必要があります。代わりにunsetを使用してください。ソリューションが機能する場合でも、望ましくない副作用があります。
David
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.