首页 文章

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

提问于
浏览
712

我有一个PHP数组如下:

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

我想删除包含值 $del_val 的元素(例如, $del_val=401 ),但我不知道它的键 . 这可能会有所帮助: each value can only be there once .

我正在寻找最简单的功能来执行此任务 .

25 回答

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

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

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

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

    array_diff

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

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

    问候

  • 19

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

    $array = array_filter($array, function($i) use ($value){return $i != $value;});
    
  • 2
    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);
    

    Output

    Array ( [0] => 312 [1] => 1599 [2] => 3 )

  • 2

    使用array_search()unset,尝试以下操作:

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

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

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

  • 99

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

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

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

  • 44

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

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

    Note: 第二个选项仅适用于带有Closures的PHP5.3

  • 8

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

    $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
    
  • 3

    如果你不知道它的关键,那就意味着无关紧要 .

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

    $messages=array();   
    $messages[312] = 312;    
    $messages[401] = 401;   
    $messages[1599] = 1599;   
    $messages[3] = 3;    
    
    unset($messages[3]); // no search needed
    
  • 3

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

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

  • 18

    借用了下划线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;
    });
    
  • 24

    根据您的要求“ each value can only be there once ”,如果您只想保留数组中的唯一值,那么array_unique()可能就是您所需要的 .

    Input:

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

    Result:

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

    你可以做:

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

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

  • 8

    最好的方式是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/

  • 2

    或使用 or 运算符的单行:

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

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

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

    参考是here

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

    (Doc:http://php.net/manual/fr/function.array-diff.php

  • 2

    你可以参考这个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)
    }
    
  • 3

    获取array_search()的密钥 .

  • 4

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

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

    一个有趣的方法是使用array_keys()

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

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

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

  • 508

    看看下面的代码:

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

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

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

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

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

相关问题