次のように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()
が値を返したかどうかをチェックし、そうであった場合にのみアクションを実行します。
さて、配列から要素を削除することは基本的にはただ一つの要素を持つ difference をセットすることです。
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
それはうまく一般化します、あなたが望むなら、あなたはあなたが同時に好きなだけ多くの要素を削除することができます。
免責事項: 私の解決策は、変更された受け入れられた答えとは対照的に、古いものを損なわずに新しい配列のコピーを作成することに注意してください。必要なものを選んでください。
1つの興味深い方法は array_keys()
を使うことです。
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
array_keys()
関数は、特定の値のキーと厳密なチェックが必要かどうかを比較するために2つの追加パラメータを取ります(つまり、比較に===を使用)。
これにより、同じ値を持つ複数の配列項目(例:[1, 2, 3, 3, 4]
)を削除することもできます。
配列にその値を持つ要素が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以降でのみ機能します
$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);
最良の理由はここにあります http://www.programmerinterview.com/index.php/php -questions/how-to-delete-an-element-from-an-array-in-php/
次のコードでは、繰り返しの値は$ messagesから削除されます。
$messages = array_diff($messages, array(401));
あるいは単純に、手動で
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
あなたはあなたの配列を完全に制御しているので、これはそれらの中で最も安全です。
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 )
あなたが> php5.3を持っているなら、1行のコードがあります:
$array = array_filter($array, function($i) use ($value){return $i != $value;});
複数の値を削除するにはこれを試してください
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
できるよ:
unset($messages[array_flip($messages)['401']]);
説明:配列を反転した後、キー401
を持つエレメントを削除してください。
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;
});
@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_search()
でキーを取得してください。
わかりました。これはまったく効率的ではありませんが、シンプルで直感的で読みやすいものです。
それで、誰かがもっと価値のない、あるいはもっと具体的な条件で動作するように拡張することができるあまり面白くない解決策を探しているなら..ここに簡単なコードがあります:
$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_diff関数を使用してください。このようなことのために素晴らしい仕事をしているようです。
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
あなたの要求通りに " それぞれの値は一度だけ存在することができます "あなたがあなたの配列の中でユニークな値を保つことに興味があるならば、 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"
}
あなたがその鍵を知らないのなら、それは問題ではないということです。
あなたはキーとして値を置くことができます、それはそれが即座に値を見つけることを意味します。何度も何度もすべての要素で検索を使用するよりも優れています。
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
あるいはor
演算子を使ったワンライナー:
($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
受け入れられた答えは、その配列を連想配列に変換します。そのため、受け入れられた答えを持つ連想配列ではない配列を保持したい場合は、array_values
も使用する必要があります。
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
参照は ここ
あなたはこれを参照することができます _ 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つの方法は、array_diffを使用することです。私はしたい場合は
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));