PHP:配列から特定の要素を削除する方法は?


159

要素名がわかっている場合、配列から要素を削除するにはどうすればよいですか?例えば:

私は配列を持っています:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

ユーザーが入る strawberry

strawberry 削除されます。

完全に説明するには:

カンマで区切られたアイテムのリストを格納するデータベースがあります。コードは、ユーザーが選択した場所に基づいてリストを取得します。したがって、イチゴを選択した場合、イチゴが配置されているすべてのエントリでプルをコーディングし、split()を使用してそれを配列に変換します。ユーザーが選択したアイテム(この例ではイチゴ)を配列から削除します。




1
より多くの同じ質問:stackoverflow.com/questions/369602/...
アレックス

回答:


295

を使用array_searchしてキーを取得しunset、見つかった場合はそれを削除します。

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchアイテムが見つからない場合はfalse(PHP 4.2.0までnull)を返します。

同じ値のアイテムが複数ある場合は、を使用array_keysしてすべてのアイテムのキーを取得できます。

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}

奇妙な結果を得る。インスタンスは常に1つしかないため、最初の提案を使用しました。それをテストするために、単にキー値を出力させました。働いた。ただし、設定が解除されることはありません。
dcp3450 2010年

1
while(odbc_fetch_row($ runqueryGetSubmenus)){$ submenuList = odbc_result($ runqueryGetSubmenus、 "サブメニュー"); $ submenuArray = split( '、'、$ submenuList); if(($ key = array_search($ name、$ submenuArray))!== false){unset($ submenuArray [$ key]); }}
dcp3450

@ dcp3450:そして、あなたは何をします$submenuArrayか?(各ループ$submenuArrayで上書きされることに注意してください。)
Gumbo

よりよく説明するために質問を更新しました。基本的に、コードはデータベース内のエントリをループして、選択したアイテム(この例では "strawberry")を削除します。したがって、ユーザーは選択を入力します=>コードはサブメニューの下を検索し、そのオプションを含むリストを見つけます=>そのリストを配列に変換します=>選択したオプションを削除します。
dcp3450 2010年

1
わかった!新しいアレイをDBに書き直していませんでした。コードを長時間見つめていると、見落としがちです。
dcp3450 2010年

153

array_diff()1行のソリューションに使用:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

...追加の関数やforeachループは必要ありません。


8
このソリューションは、上位のソリューションよりも読みやすくなっています。
ロバート2015

strawberry最初の配列にない場合でも、$array_without_strawberries配列で使用できるようになります-特定の要素が配列にないことを確認する場合は危険なコードです。
Erfan 2017

5
@Erfanあなたの主張は間違っています。$a = array_diff(array(), array('strawberry'));-$ aは空の配列です。
バンサー2017

1
あなたは正しい@bancer-私はおそらくarray_intersectか何かを考えていました。
Erfan

1
array_diff()は、マークされた回答よりもエレガントです。
Dom DaFonte 2017

36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

2
イチゴがアレイにあるかどうかをテストする必要があります。
Gumbo

ガンボのアドバイスに従って、配列から削除する前に要素の検証を含めるように回答を修正しました。
John Conde

2
また、特定の要素を削除した後にインデックスが再調整されないことにも注意してください。つまり、インデックスシーケンスにはギャップがあります。例から「イチゴ」を削除しても、「キウイ」にはインデックス4が残り、インデックス2は単に消えます。たとえばfor($ i = 0; $ i <..、$ i ++)ループのように、コードがインデックスシーケンスの完全性に依存しているかどうかが重要です。
バナナ王、

2
the-banana-kingが言ったことに追加するには、配列のインデックスを再作成したい場合は、単にを実行します$my_array = array_values($my_array);
ryeguy

2
このソリューションは正しいですが、配列TWICE(in_arrayおよびarray_search)を検索します。array_searchGumboの回答でのas のリターンの使用はより効果的です
Bogdan D

21

ここで単純な配列を使用している場合(ケースのようです)、代わりに次のコードを使用する必要があります。

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) 要素を削除するだけですが、プレーン配列を並べ替えません。

おそらく配列があり、array_spliceを使用するとします。

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

未設定と比較:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

unset($array[$key])が配列を並べ替えないことに注意してください。


正式にunsetは何も返しません。したがってjson_encode(unset($array[2]))、比較には適していません。
robsch

これがまさに私が必要としていることです、ericluwjに感謝します
ana

12

配列フィルターを使用して、次の特定の条件でアイテムを削除できます$v

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});

反対票。この低品質(コードのみの回答であり、解析エラーが発生するため)は、内部で匿名関数を使用するだけのD.Martinのメソッドの複製ですarray_filter()。私の個人的な実装では匿名関数を使用しますが、このページが膨らまないように微妙な改善をしたい場合は、SOに対する正しいアクションはD.Martinの回答にコメントするか編集することだと思います。この重複する回答を削除してください。
mickmackusa 2017

4

このようになります:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");

4

これは、配列内の複数の値を削除できる単純な繰り返しです。

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }

これは、PHPの開発者がすでにで作成したものに代わる、非効率的なホームロールの代替品ですarray_diff()。これはどのようにして3つの賛成票を得ましたか。この答えが役に立ったとか、自分のプロジェクトで使ってはいけません。この回答を削除することをお勧めします。これにより、アカウントの質の低い回答を解放し、このページの回答の膨らみを減らして、規律のあるバッジを獲得できます。報酬のために削除する時間があるように、私は私の反対投票を延期します。
mickmackusa 2017

4

ちょうどあなたが単一の行を行うことができます。それは配列から要素を削除します


$array=array_diff($array,['strawberry']);


3

私は現在この関数を使用しています:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

削除する要素を含む配列または文字列のみを入力できます。このように書いてください:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

または

$detils = array_delete('orange', $detils);

また、インデックスを再作成します。


2
これは恐ろしく複雑で、ルーピーです。これはどうして3つの賛成票を獲得したのですか?
mickmackusa 2017

2

この質問にはいくつかの回答がありますが、特定の要素が削除されたときに(最初のインデックスが保存されているため)新しい配列のインデックスを使用するunsetか、array_diffいくつかの問題があったため、さらに追加したいと思います。

例に戻ります:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

または

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

結果を印刷すると、次のようになります。

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

結果:

> apple
> orange
> blueberry
> kiwi

ただし、インデックスは保存されるため、次のように要素にアクセスします。

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

したがって、最終的な配列のインデックスは再作成されません。したがって、unsetまたはの後に追加する必要がありますarray_diff

$array_without_strawberries = array_values($array);

その後、配列は通常のインデックスになります:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

この投稿に関連する:配列の再インデックス

ここに画像の説明を入力してください

それが役に立てば幸い


1

より良いアプローチは、連想配列のキーとして値を保持し、array_keys()実際の配列にしたいときに呼び出すことです。そうすればarray_search、要素を見つけるためにを使用する必要はありません。


1
あなたの投稿は回答ではなくコメントです。質問自体の下で削除して投稿してください。
mickmackusa 2017

1

回答PHP配列(キーではない)値により削除 によって与え https://stackoverflow.com/users/924109/rok-kralj

IMOは削除され、変化しないため、最良の答えです

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

それはうまく一般化し、必要に応じて、好きなだけ多くの要素を同時に削除できます。

免責事項:私の解決策は、変化する受け入れられた回答とは対照的に、古いものをそのまま維持しながら、配列の新しいコピーを生成することに注意してください。このため、少し遅くなる可能性があります。


1

私は同じ質問への答えを探していて、このトピックに出くわしました。array_search&の組み合わせunsetとの使用の2つの主な方法がわかりますarray_diff。一見すると、追加の配列を作成する必要がないため(を使用する場合のようにarray_diff)、最初の方法の方が高速であるように見えました。しかし、私は小さなベンチマークを書いて、2番目の方法がより簡潔であるだけでなく、より高速であることを確認しました!これを共有してくれてうれしいです。:)

https://glot.io/snippets/f6ow6biaol


0

私が使用することを好むだろうarray_key_existsをのような配列のキーを検索します:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

array_searchとin_array()はここでは機能しないため、指定されたものを効果的に見つけることができます。そして、unset()でものを削除します。

私はそれが誰かを助けると思います。


0

特定の配列値を削除して数値配列を作成する

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

このリンクを参照できます。


反対票。質問では、値(キーではない)に基づいて値を削除することが明確に求められます。この回答は役に立ちません。削除してください。
mickmackusa 2017

0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

この回答では、必要なオプションも削除されません。
Nigel Ren

-1

を使用してarray_seach()、次のことを試してください。

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()見つかった要素のキーを返します。これを使用して、を使用して元の配列からその要素を削除できますunset()。それは戻りますFALSEが、それは(あなたの鍵があることも成功の「falsey」の値を返すことができ、失敗時に0厳密な比較の理由である、例えば)!==演算子が使用されています。

if()ステートメントがいるかどうかを確認しますarray_search()返された値、およびそれがなかった場合にのみアクションを実行します。


3
反対票。これはあなたの何年も前に投稿されたガンボの方法(現在受け入れられている解決策)の複製です。重複した回答は価値がなく、不必要なページ膨張を引き起こすだけです。回答を削除してください。あなたはガンボの答えを説明したい場合は、...彼の答えに編集して、そうか、自分自身の答えを拡大するガンボを頼む
mickmackusa

-1
unset($array[array_search('strawberry', $array)]);

2
反対票。array_search()- unset()この方法は、すでにあなたの前にジョン・コンデ年によって投稿されました。重複した回答は読者にとって価値がなく、スクロールして冗長な情報を読んでいる間に時間が浪費されるため、実際には不便です。この回答を削除してください。
mickmackusa 2017

-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

2
この回答を改善するには、a)コードの機能、およびb)他のすべての回答の中で選択肢であると考える理由を1つまたは2つ記述します。
ロビンマッケンジー

-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }

4
あなたが提供した答えに加えて、これが問題を修正する理由と方法の簡単な説明を提供することを検討してください。
jtate

-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);

2
説明も追加してください。それが問題をどのように解決するか。
Rahil Wazir 2014

あなたの答えは、配列のある要素を別のNOに置き換えて、要素を削除することです
ahmed hamdy 2014

反対票。この回答は期待される出力を提供しません。この不正解を削除してください。
mickmackusa 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.