次のようなPHP配列があります。
$messages = [312, 401, 1599, 3, ...];
値を含む要素$del_val
(たとえば$del_val=401
)を削除したいのですが、そのキーがわかりません。これは役立つかもしれません:各値は一度だけ存在できます。
このタスクを実行する最も簡単な機能を探しています。
次のようなPHP配列があります。
$messages = [312, 401, 1599, 3, ...];
値を含む要素$del_val
(たとえば$del_val=401
)を削除したいのですが、そのキーがわかりません。これは役立つかもしれません:各値は一度だけ存在できます。
このタスクを実行する最も簡単な機能を探しています。
回答:
array_search()
およびを使用してunset
、次のことを試してください。
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
見つかった要素のキーを返します。これを使用して、を使用して元の配列からその要素を削除できますunset()
。FALSE
失敗すると戻りますが、成功するとfalse-y値を返す可能性があります(0
たとえば、キーがその可能性があります)。そのため、厳密な比較!==
演算子が使用されます。
このif()
ステートメントはarray_search()
、値が返されたかどうかをチェックし、返された場合にのみアクションを実行します。
array_diff()
、それはだと遅くなり2つの比較単にを検索ない、アレイの1のようにarray_search()
。
$key
ありますか0
?
0
またはその他の誤った値がある場合、値の設定が解除されず、コードは機能しません。あなたはテストする必要があります$key === false
。(編集-あなたはそれを得た)
まあ、配列から要素を削除することは、基本的に1つの要素との差を設定するだけです。
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
それはうまく一般化し、必要に応じて、好きなだけ多くの要素を同時に削除できます。
免責事項:私の解決策は、変化する受け入れられた回答とは対照的に、古いものをそのまま維持しながら、配列の新しいコピーを生成することに注意してください。必要なものを選択してください。
[$element]
いるarray($element)
ようです。代わりに使用しました。大したことはありませんが、同様の問題を抱えている人が一人ではないことを知って
array_diff
使用さ(string) $elem1 === (string) $elem2
れていることに注意し$elem1 === $elem2
てください。@ nischayn22によって指摘された問題は、この結果です。任意の要素(オブジェクトである可能性があります)の配列に対して機能するユーティリティ関数として何かを使用したい場合は、この理由からBojangleの答えの方が良いでしょう。
array_diff()
実行し、ランタイムをO(n)からO(n lg n)までナッジします。
興味深い方法の1つは、次のものを使用することarray_keys()
です。
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
このarray_keys()
関数は、特定の値のキーのみを返すために2つの追加のパラメーターを受け取り、厳密なチェックが必要かどうか(つまり、比較に===を使用)を使用します。
これにより、同じ値を持つ複数の配列項目を削除することもできます(例:)[1, 2, 3, 3, 4]
。
array_values()
になります。残りのキーは、その技術的には「未ソート」ではありません、しかし同じ順序にまだある
配列にその値を持つ要素が1つだけ含まれることが明確にわかっている場合は、
$key = array_search($del_val, $array);
if (false !== $key) {
unset($array[$key]);
}
ただし、値が配列で複数回出現する可能性がある場合は、これを行うことができます
$array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
});
注: 2番目のオプションは、のみでPHP5.3 +のために働くクロージャ
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
次のコードを見てください:
$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')
最良の方法は array_splice
array_splice($array, array_search(58, $array ), 1);
[1, 2, 4 => 3]
。
3
と、配列は次のようになり[1, 2, 3]
ます。つまり、値は削除されませんでした。明確にするために、これがすべてのシナリオで失敗すると言っているのではなく、これだけです。
または単に、手動の方法:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
アレイを完全に制御できるため、これが最も安全です。
array_splice()
代わりにunset()
を使用すると、配列のインデックスも並べ替えられます。これは、この場合に適しています。
次のコードにより、反復的な値が$ messagesから削除されます。
$messages = array_diff($messages, array(401));
PHPを使用している場合5.3+
は、次の1行のコードがあります。
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
$value
ので、本当にそれはあなたがアクセスできるように、ミニクラスに入れなければならず、$value
....クロージャ内
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 )
できるよ:
unset($messages[array_flip($messages)['401']]);
説明:401
配列を反転した後、キーを持つ要素を削除してください。
401
どうなりますか?
複数の値を削除するには、これを試してください:
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
underscore.JS _.rejectのロジックを借用し、2つの関数を作成しました(人々は関数を好む!!)
array_reject_value:この関数は、指定された値を単に拒否します(PHP4、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のように使用するためのより良い構文が得られます)
$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;
});
@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
}
}
よろしく
シングルライナーコード(array_diff()のおかげで)、以下を使用:
$messages = array_diff($messages, array(401));
要件によると、配列に一意の値を保持することにのみ関心がある場合は、「各値は一度だけ存在することができます」ので、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"
}
削除する値が配列内にある場合、または配列内にある可能性がある場合。array_diff関数を使用します。このようなものに最適に動作するようです。
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
これはまったく効率的ではありませんが、シンプルで直感的で読みやすいことを知っています。
したがって、誰かがより多くの値、またはより具体的な条件で動作するように拡張できるそれほど豪華ではないソリューションを探している場合、ここに簡単なコードを示します。
$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
で配列キーを取得しarray_search()
ます。
そのキーがわからない場合、それは重要ではないことを意味します。
値をキーとして配置することもできます。つまり、すぐに値を見つけることができます。すべての要素で何度も検索を使用するよりも優れています。
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
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つのアイデアは、array_diffを使用することです。私はしたい場合は
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
(ドキュメント:http : //php.net/manual/fr/function.array-diff.php)
最も簡単な方法は、関数をforeachループで使用することだと思います。
//This functions deletes the elements of an array $original that are equivalent to the value $del_val
//The function works by reference, which means that the actual array used as parameter will be modified.
function delete_value(&$original, $del_val)
{
//make a copy of the original, to avoid problems of modifying an array that is being currently iterated through
$copy = $original;
foreach ($original as $key => $value)
{
//for each value evaluate if it is equivalent to the one to be deleted, and if it is capture its key name.
if($del_val === $value) $del_key[] = $key;
};
//If there was a value found, delete all its instances
if($del_key !== null)
{
foreach ($del_key as $dk_i)
{
unset($original[$dk_i]);
};
//optional reordering of the keys. WARNING: only use it with arrays with numeric indexes!
/*
$copy = $original;
$original = array();
foreach ($copy as $value) {
$original[] = $value;
};
*/
//the value was found and deleted
return true;
};
//The value was not found, nothing was deleted
return false;
};
$original = array(0,1,2,3,4,5,6,7,4);
$del_val = 4;
var_dump($original);
delete_value($original, $del_val);
var_dump($original);
出力は次のようになります。
array(9) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
[8]=>
int(4)
}
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
}