[英]PHP array delete by value (not key)
我有一个 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( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它很好地概括,如果需要,您可以同时删除任意数量的元素。
免责声明:请注意,与已接受的变异答案相比,我的解决方案会生成数组的新副本,同时保持旧的完整副本。 选择您需要的那个。
一种有趣的方法是使用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);
最好的方法是array_splice
array_splice($array, array_search(58, $array ), 1);
看下面的代码:
$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')
或者简单地说,手动方式:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
这是其中最安全的,因为您可以完全控制您的阵列
通过以下代码,重复值将从$ messages中删除。
$messages = array_diff($messages, array(401));
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 )
如果您具有PHP 5.3+
,则只有一行代码:
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
你可以做:
unset($messages[array_flip($messages)['401']]);
说明:翻转数组后删除键为401
的元素。
在 PHP 7.4 中使用箭头函数:
$messages = array_filter($messages, fn ($m) => $m != $del_val);
为了保持它是一个非关联数组,用array_values()
包装它:
$messages = array_values(array_filter($messages, fn ($m) => $m != $del_val));
要删除多个值,试试这个:
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
借用underscore.JS _.reject 的逻辑,创建了两个函数(人们更喜欢函数!!)
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_values
。
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
参考在这里
@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
}
}
问候
我知道这根本没有效率,但简单、直观且易于阅读。
因此,如果有人正在寻找一个不太花哨的解决方案,该解决方案可以扩展为使用更多值或更具体的条件......这里是一个简单的代码:
$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() ),请使用以下代码:
$messages = array_diff($messages, array(401));
使用array_search()
获取数组键。
如果要删除的值位于或可以位于数组中。 使用array_diff函数。 似乎对这样的事情非常有用。
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
使用or
运算符的单行:
($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
如果您不知道其密钥,则意味着它无关紧要。
您可以将值作为键,这意味着它会立即找到该值。 比一遍又一遍地在所有元素中使用搜索更好。
$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)
}
PHP 7.4 或以上
function delArrValues(array $arr, array $remove) {
return array_filter($arr, fn($e) => !in_array($e, $remove));
};
所以,如果你有数组
$messages = [312, 401, 1599, 3];
并且您想从 $messages 数组中删除3, 312
,您可以这样做
delArrValues($messages, [3, 312])
它会回来
[401, 1599]
最好的部分是您可以轻松过滤多个值,即使同一值多次出现。
根据您的要求“每个值只能存在一次”,如果您只想在数组中保留唯一值,那么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"
}
我认为最简单的方法是使用带有 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)
}
这是一个简单但可以理解的解决方案:
$messagesFiltered = [];
foreach ($messages as $message) {
if (401 != $message) {
$messagesFiltered[] = $message;
}
}
$messages = $messagesFiltered;
删除数组值的另一个想法是使用array_diff。 如果我想
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
$array = array("apple", "banana",'mango');
$array = array_filter($array, function($v) { return $v != "apple"; });
试试这个,这是按值删除元素的最佳,最快方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.