PHP数组按值删除(不是键)
我有一个PHP数组,如下所示:
$messages = [312, 401, 1599, 3, ...];
我想删除包含值$del_val
(例如, $del_val=401
)的元素,但我不知道它的关键。 这可能有帮助: 每个值只能在那里一次 。
我正在寻找最简单的function来执行这项任务。
使用array_search()
并unset
,请尝试以下操作:
if (($key = array_search($del_val, $messages)) !== false) { unset($messages[$key]); }
array_search()
返回它find的元素的键,可以使用unset()
从原始数组中删除该元素。 它将在失败时返回FALSE
,但是它可以在成功时返回false-y值(例如,您的键可能为0
),这就是为什么使用严格比较!==
运算符的原因。
if()
语句将检查array_search()
是否返回一个值,并且只会执行一个操作。
那么,从数组中删除一个元素基本上只是与一个元素设置差异。
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它很好地概括,你可以同时删除尽可能多的元素,如果你想。
免责声明:请注意,我的解决scheme产生了一个新的数组副本,同时保持旧的一个完整的对比,接受的答案变异。 因为这个可能会慢一些。
一个有趣的方法是使用array_keys()
:
foreach (array_keys($messages, 401, true) as $key) { unset($messages[$key]); }
array_keys()
函数需要两个额外的参数来返回一个特定的值的关键和是否需要严格的检查(即使用===比较)。
这也可以删除多个具有相同值的数组项(例如[1, 2, 3, 3, 4]
)。
如果你知道你的数组只包含一个具有该值的元素,你可以这样做
$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); });
注意:第二个选项只适用于带闭包的 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);
通过以下代码,重复值将从$ 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 )
要删除多个值,请尝试这一个
while (($key = array_search($del_val, $messages)) !== false) { unset($messages[$key]); }
你可以做:
unset($messages[array_flip($messages)['401']]);
说明:在翻转数组后,删除具有键401
的元素。
如果你有> php5.3,有一行代码:
$array = array_filter($array, function($i) use ($value){return $i != $value;});
借用了下划线_.reject的逻辑并创build了两个函数(人们更喜欢函数!!)
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; });
使用array_search()
获取密钥。
@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函数。 似乎对这样的事情很好。
和array_diff
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
好的..我知道这是不是很有效,但是简单,直观,易于阅读。
所以如果有人正在寻找一个不是那么奇特的解决scheme,可以扩展到更多的价值,或更具体的条件下工作..这里是一个简单的代码:
$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
如果你不知道它的关键,那就意味着没关系。
您可以将该值作为关键字,这意味着它会立即find值。 比在所有元素中一次又一次地search更好。
$messages=array(); $messages[312] = 312; $messages[401] = 401; $messages[1599] = 1599; $messages[3] = 3; unset($messages[3]); // no search needed
根据你的要求,“ 每个值只能存在一次 ”,如果你只是想保持你的数组中的唯一值,那么array_unique()
可能是你正在寻找的。
input:
$input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input); var_dump($result);
结果:
array(2) { [0] => int(4) [2] => string(1) "3" }
或使用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 :for function
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) }
另一个想法是删除一个数组的值,使用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 )