web-dev-qa-db-ja.com

PHP 値による配列削除(キーではありません)

次のようにPHP配列があります。

$messages = [312, 401, 1599, 3, ...];

$del_val(たとえば、$del_val=401)を含む要素を削除したいのですが、そのキーがわかりません。これは助けになるかもしれません: 各値は一度だけそこにあることができます

このタスクを実行するための最も簡単な機能を探しています。

772
Adam Strudwick

array_search() および unset を使用して、次のことを試してください。

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

array_search()は、見つかった要素のキーを返します。これは、unset()を使用して元の配列からその要素を削除するために使用できます。失敗するとFALSEを返しますが、成功するとfalse-y値を返すことがあります(たとえば、キーは0になる可能性があります)。このため、厳密比較!==演算子が使用されます。

if()ステートメントは、array_search()が値を返したかどうかをチェックし、そうであった場合にのみアクションを実行します。

1379
Bojangles

さて、配列から要素を削除することは基本的にはただ一つの要素を持つ difference をセットすることです。

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

それはうまく一般化します、あなたが望むなら、あなたはあなたが同時に好きなだけ多くの要素を削除することができます。

免責事項: 私の解決策は、変更された受け入れられた答えとは対照的に、古いものを損なわずに新しい配列のコピーを作成することに注意してください。必要なものを選んでください。

557
Rok Kralj

1つの興味深い方法は array_keys() を使うことです。

foreach (array_keys($messages, 401, true) as $key) {
    unset($messages[$key]);
}

array_keys() 関数は、特定の値のキーと厳密なチェックが必要かどうかを比較するために2つの追加パラメータを取ります(つまり、比較に===を使用)。

これにより、同じ値を持つ複数の配列項目(例:[1, 2, 3, 3, 4])を削除することもできます。

102
Ja͢ck

配列にその値を持つ要素が1つだけ含まれることが明確にわかっている場合は、次のようにします。

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

しかし、あなたの値があなたの配列の中に2回以上現れるかもしれないなら、あなたはこれをすることができます

$array = array_filter($array, function($e) use ($del_val) {
    return ($e !== $del_val);
});

注: 2番目のオプションは Closuresを指定したPHP 5.3以降でのみ機能します

46
adlawson
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
36
Rmannn

次のコードを見てください。

$arr = array('Nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

できるよ:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

そしてそれはあなたにこの配列を取得します:

array('Nice_item', 'another_liked_item')
25
theCodeMachine

最善の方法は array_splice です。

array_splice($array, array_search(58, $array ), 1);

最良の理由はここにあります http://www.programmerinterview.com/index.php/php -questions/how-to-delete-an-element-from-an-array-in-php/

21

次のコードでは、繰り返しの値は$ messagesから削除されます。

$messages = array_diff($messages, array(401));

19

あるいは単純に、手動で

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

あなたはあなたの配列を完全に制御しているので、これはそれらの中で最も安全です。

16
function array_remove_by_value($array, $value)
{
    return array_values(array_diff($array, array($value)));
}

$array = array(312, 401, 1599, 3);

$newarray = array_remove_by_value($array, 401);

print_r($newarray);

出力

Array ( [0] => 312 [1] => 1599 [2] => 3 )

11
tttony

あなたが> php5.3を持っているなら、1行のコードがあります:

$array = array_filter($array, function($i) use ($value){return $i != $value;}); 
9
David Lin

複数の値を削除するにはこれを試してください

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

できるよ:

unset($messages[array_flip($messages)['401']]);

説明:配列を反転した後、キー401を持つエレメントを削除してください。

8
Qurashi

UnderscoreJS _.rejectのロジックを借りて2つの関数を作成しました(人々は関数を好む!)

array_reject_value: この関数は単に指定された値を拒否します(PHP 4、5、7でも機能します)。

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject: この関数は単に呼び出し可能メソッドを拒否しています(PHP> = 5.3に対応)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

したがって、現在の例では、上記の関数を次のように使用できます。

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

またはもっと良い:(これにより、 array_filter oneのように使用する構文が改善されます)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

上の例は、401以上のすべての値を単純に削除したいとしましょう。

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});
5

@Bojanglesの回答が役に立ちました。ありがとうございました。

私の場合、配列は連想型でもそうでなくてもかまいませんので、この関数を追加しました

function test($value, $tab) {

 if(($key = array_search($value, $tab)) !== false) {
    unset($tab[$key]); return true;

 } else if (array_key_exists($value, $tab)){
        unset($tab[$value]); return true;

 } else {
    return false; // the $value is not in the array $tab
 }

}

よろしく

4
angeltcho

シングルライナーコード( array_diff() のおかげで)、以下を使用:

$messages = array_diff($messages, array(401));
4
Star

array_search() でキーを取得してください。

4
evan

わかりました。これはまったく効率的ではありませんが、シンプルで直感的で読みやすいものです。
それで、誰かがもっと価値のない、あるいはもっと具体的な条件で動作するように拡張することができるあまり面白くない解決策を探しているなら..ここに簡単なコードがあります:

$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);

foreach($arr as $key =>$value){
    if ($value !== $del_value){
        $result[$key] = $value;
    }

    //if(!in_array($value, $del_values)){
    //    $result[$key] = $value;
    //}

    //if($this->validete($value)){
    //      $result[$key] = $value;
    //}
}

return $result
3
d.raev

削除したい値が配列である場合、またはそうである場合があります。 array_diff関数を使用してください。このようなことのために素晴らしい仕事をしているようです。

array_diff

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
3
user1518699

あなたの要求通りに " それぞれの値は一度だけ存在することができます "あなたがあなたの配列の中でユニークな値を保つことに興味があるならば、 array_unique() はあなたが探しているかもしれません。

入力:

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);

結果:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}
3

あなたがその鍵を知らないのなら、それは問題ではないということです。

あなたはキーとして値を置くことができます、それはそれが即座に値を見つけることを意味します。何度も何度もすべての要素で検索を使用するよりも優れています。

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed
2
Ismael

あるいはor演算子を使ったワンライナー:

($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
2
Eric

受け入れられた答えは、その配列を連想配列に変換します。そのため、受け入れられた答えを持つ連想配列ではない配列を保持したい場合は、array_valuesも使用する必要があります。

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

参照は ここ

2
SaidbakR

あなたはこれを参照することができます _ url _ :機能のために

array-diff-key()

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_key($array1, $array2));
?>

それから出力はあるべきです、

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
1
manish1706

配列の値を削除するもう1つの方法は、array_diffを使用することです。私はしたい場合は

$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));

(Doc: http://php.net/manual/fr/function.array-diff.php

0
Dana