使用array_diff_key()通过一个特定键删除元素

时间:2017-07-01 10:45:57

标签: php

我想使用带有一个特定键的array_diff_key()移除一个或多个数组元素,但结果是不同的

$a = [
        ['value' => 1, 'text' => '1 Hour'],
        ['value' => 12, 'text' => '12 Hour'],
        ['value' => 24, 'text' => '1 Day'],
    ];

$b = [
        ['value' => 12],    
    ];

$c = array_diff_key($a, $b);

//print_r($c);
//return Array ( [1] => Array ( [value] => 12 [text] => 12 Hour ) [2] => Array ( [value] => 24 [text] => 1 Day ))

预期结果

Array ( 
      [1] => Array ( 
        [value] => 1 
        [text] => 1 Hour ) 
      [2] => Array ( 
        [value] => 24 
        [text] => 1 Day ) 
)

如果我在text中设置$b,我可以获得预期结果,但在这种情况下,我不想设置text

我做错了什么?其他解决方案很好。

提前致谢

PS:$b可以是一个或多个元素

3 个答案:

答案 0 :(得分:2)

尝试以下代码,

  

检查彻底循环。

<?php
    $a = [
            ['value' => 1, 'text' => '1 Hour'],
            ['value' => 12, 'text' => '12 Hour'],
            ['value' => 24, 'text' => '1 Day'],
        ];

    $b = [
            ['value' => 12]
        ];
    $c = array();


    function checkExists($array,$value){
        foreach($array as $k=>$values){
            if($values['value']==$value){
                return true;break;
            }
        }
        return false;
    }
    foreach($a as $k=>$v){
        if(checkExists($b,$v['value'])===false){
            $c[$k]=$v;
        }
    }
?>

<强>输出

Array
(
    [0] => Array
        (
            [value] => 1
            [text] => 1 Hour
        )

    [2] => Array
        (
            [value] => 24
            [text] => 1 Day
        )

)

答案 1 :(得分:1)

没有必要为非常复杂的for循环创作。使用applications/config/autoload.php时,您可以简单地定义自己的比较器函数:

$autoload['libraries'] = array('database', 'session');

$autoload['helper'] = array('url', 'html', 'form');

这应该会给你你期望的数组:

array_udiff()

答案 2 :(得分:0)

您确定没有使用array_diff_keys()吗?你误解了array_reduce();它只适用于单维关联数组 - 即带键的元素。数组的第一个维度没有任何键。

我们可以用$a = [ ['value' => 1, 'text' => '1 Hour'], ['value' => 12, 'text' => '12 Hour'], ['value' => 24, 'text' => '1 Day'], ]; $b = [ ['value' => 12] ]; function filter($v1,$v2) { global $b; var_dump($v1,$v2); return ($b[0]['value'] == $v2['value']) ? $v1 : array_merge($v1, [$v2]); } print_r(array_reduce($a,"filter",[])); 编写一个简单的解决方案:

app.post("/test", function(req, res){
let tagcontent = req.body.q.tag;
let regexValue = '/'+tagcontent+'/';

  Tags.find({"tagname": /exampletag/}, function(err, tags){

    if(err){
      console.log(err);
    }else{
      res.send(tags);
    }

  });
});

简短,甜蜜,没有显式迭代器,也没有临时变量。