提问



我有一个PHP数组如下:


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


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


我正在寻找最简单的功能来执行这项任务。

最佳参考


使用array_search()unset,尝试以下方法:[56] [57]


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


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


if()语句将检查array_search()是否返回一个值,并且只会执行一个操作。

其它参考1


好吧,从数组中删除一个元素基本上只是设置一个元素的差异。


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


它很好地概括,如果你愿意,你可以同时删除任意数量的元素。


免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的变异形式相反。由于这个原因,它可能会有点慢。

其它参考2


一个有趣的方法是使用array_keys():[58]


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


array_keys()函数需要两个附加参数来仅返回特定值的键以及是否需要严格检查(即使用===进行比较)。[59]


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

其它参考3


如果您确定您的数组将只包含一个具有该值的元素,那么您可以这样做


$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 + with Closures [60]

其它参考4


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

其它参考5


看看下面的代码:


$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')

其它参考6


通过以下代码,重复值将从$ messages中删除。


$messages = array_diff($messages, array(401));

其它参考7


最好的方法是array_splice [61]


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/[62]

其它参考8


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


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


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

其它参考9


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 )

其它参考10


要删除多个值,请尝试使用此值


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

其它参考11


你可以做:


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


说明:翻转数组后删除具有键401的元素。

其它参考12


如果您有> php5.3,则有一行代码:


$array = array_filter($array, function($i) use ($value){return $i != $value;}); 

其它参考13


借用了下划线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一样)[63]


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

其它参考14


array_search()获取密钥。[64]

其它参考15


@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
 }

}


问候

其它参考16


如果要删除的值是或可以在数组中。使用array_diff函数。似乎很适合这样的事情。


和array_diff [65]


$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);

其它参考17


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


$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

其它参考18


如果你不知道它的关键,那就意味着它并不重要。


您可以将值作为键,这意味着它将立即找到值。比一遍又一遍地使用所有元素中的搜索更好。


$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed

其它参考19


根据您的要求每个值只能在那里,如果您只想保留数组中的唯一值,那么array_unique()可能就是您要找的。[66]


输入:


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


结果:


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

其它参考20


或使用or运算符的单行:


($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);

其它参考21


接受的答案是将数组转换为关联数组,因此,如果您希望将其保留为具有接受答案的非关联数组,则可能还必须使用array_values


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


参考文献在这里

其它参考22


你可以参考这个网址:
    功能[68]


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

其它参考23


单线代码(感谢array_diff()),使用以下内容:[69]


$messages = array_diff($messages, array(401));

其它参考24


删除数组值的另一个想法是使用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)[70]