PHP数组按值删除(不是键)

我有一个PHP数组如下:

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

我想删除包含值为$del_val的元素(例如,$del_val=401),但我不知道它的键。这可能会有帮助:每个值只能出现一次

我正在寻找执行这项任务的最简单的函数。

1158991 次浏览

使用# 0# 1,尝试以下方法:

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

array_search()返回它找到的元素的键,可用于使用unset()从原始数组中删除该元素。如果失败,它将返回FALSE,但是如果成功,它可以返回一个假的y值(例如,您的键可能是0),这就是使用严格比较!==操作符的原因。

if()语句将检查array_search()是否返回值,如果返回了,则只执行操作。

如果你明确知道你的数组将只包含一个具有该值的元素,你可以这样做

$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+和闭包

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);

输出

# 0

从数组中删除一个元素基本上就是用一个元素设置区别

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

它很好地泛化了,你可以同时删除任意多的元素,如果你想的话。

免责声明:请注意,我的解决方案产生了一个新的数组副本,同时保持旧的一个完整的对比,接受的答案突变。选一个你需要的。

$fields = array_flip($fields);unset($fields['myvalue']);$fields = array_flip($fields);

一个有趣的方法是使用# 0:

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

1号函数接受两个额外的参数,只返回特定值的键,以及是否需要严格检查(即使用===进行比较)。

这也可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4])。

要删除多个值,试试这个:

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

或者简单地说,手动方式:

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

这是最安全的,因为你可以完全控制你的阵列

使用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_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/

我知道这一点效率都没有,但是简单,直观,易于阅读因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到更多的值,或更具体的条件。这是一个简单的代码:

$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

你可以:

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

解释:在翻转数组后删除键为401的元素。

借用了underscore.JS _的逻辑。拒绝并创建了两个函数(人们更喜欢函数!!)

这个函数只是简单地拒绝指定的值(也适用于PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {if ($value !== $deleteValue) {$filteredArray[] = $value;}}
return $filteredArray;}

这个函数只是简单地拒绝可调用方法(适用于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;});

根据你的要求“每个值只能出现一次”,如果你只是想在数组中保持唯一的值,那么# 0可能就是你要找的。

输入:

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

结果:

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

接受的答案将数组转换为关联数组,因此,如果您想保留它作为接受的答案的non-associative数组,您可能也必须使用array_values

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

参考是在这里

我认为最简单的方法是使用带有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 instancesif($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 deletedreturn true;};//The value was not found, nothing was deletedreturn 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)}

在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));

这里有一个简单但可以理解的解决方案:

$messagesFiltered = [];foreach ($messages as $message) {if (401 != $message) {$messagesFiltered[] = $message;}}$messages = $messagesFiltered;

PHP 7.4或以上

function delArrValues(array $arr, array $remove) {return array_filter($arr, fn($e) => !in_array($e, $remove));};

如果你有数组as

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

和你想从$messages数组中删除3, 312,你会这样做

delArrValues($messages, [3, 312])

它会返回

[401, 1599]

最好的部分是您可以轻松地过滤多个值,即使相同的值出现了多次。