【问题标题】:php - Comparing associative and numeric array using array_diffphp - 使用 array_diff 比较关联数组和数值数组
【发布时间】:2015-06-24 17:26:43
【问题描述】:

Array1 是一个关联数组,包含从 MySQL 获取的多个列表,而 Array2 是一个数值数组,即简单数组。 Array2有list_ids,用来过滤Array1。

Array1 的样本:

Array (
    [0] => Array (
        [id] => 1
        [list_id] => 68
        [list_value] => List-68
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [1] => Array (
        [id] => 2
        [list_id] => 69
        [list_value] => List-69
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [2] => Array (
        [id] => 3
        [list_id] => 80
        [list_value] => List-80
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [3] => Array (
        [id] => 4
        [list_id] => 81
        [list_value] => List-81
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
)

数组2:

[68, 81]

我的输出应该是:

Array (     
    [0] => Array (
        [id] => 2
        [list_id] => 69
        [list_value] => List-69
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [1] => Array (
        [id] => 3
        [list_id] => 80
        [list_value] => List-80
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
)

所以,在正常情况下array_diff() 会这样做,但在这里它不会起作用。我尝试将数值 Array2 转换为关联并使用 array_diff_assoc() 函数,但仍然不起作用。

我还尝试遍历我的数值数组并检查关联 Array1 中的每个元素(即从 MySQL 获取的每个行)以查找数值数组中的每个数字。

foreach ($list as $val) {
    while ( $r = mysqli_fetch_assoc($result)) {
        echo $val."<br/>";
        if($r['list_id'] != $val ) {
                $new[] = $r;
        }
    }       
}
print_r($new);

但输出仅回显数字 Array1 的第一个数字 4 次(Array1 的长度),因此只有一个 list_id 从关联 Array2 中删除,而不是 2:

68
68
68
68
Array (     
    [0] => Array (
        [id] => 2
        [list_id] => 69
        [list_value] => List-69
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [1] => Array (
        [id] => 3
        [list_id] => 80
        [list_value] => List-80
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )
    [2] => Array (
        [id] => 4
        [list_id] => 81
        [list_value] => List-81
        [subject] => "abc"
        [message] => "abc"
        [obj_var] => "abc"
        [url_link] => "abc"
        [list_time] => 2014-05-13 22:04:04
    )

)

那么,我怎样才能让它工作呢?最佳算法是什么?

【问题讨论】:

    标签: php mysql arrays multidimensional-array


    【解决方案1】:

    您可以使用foreach 循环和in_array 检查unset 不需要的元素:

    foreach ($Array1 as $key => $value)
        if(in_array($valeu['list_id'], $Array2)) unset($list[$key]);
    

    【讨论】:

    • 好吧,这行得通。我不能mysqli_fetch_all 因为关联数组不包含list_id 作为每个列表ID 的键。所以现在,在遍历这个 foreach 循环之前,我必须遍历我的结果并将行添加到$Array1
    【解决方案2】:

    我已将您的代码简化为以下内容。

    $arr1 = array();
    while ( $r = mysqli_fetch_assoc($result)) { $arr1[] = $r; }
    $arr2 = array(68,81);
    
    // the magic happends here. It will return an array with only the elements that matches the id of those values in $arr2
    $filtered = array_filter($arr1, function ($val) use ($arr2) { return !in_array($val['id'], $arr2); });
    

    【讨论】:

    • 想要返回匹配的元素。抱歉,如果我的问题不清楚,但我的意思是我想要两个数组中都不匹配的元素。
    • 那很简单,放一个!,我给你改了答案
    • 好的,现在看起来不错。另外,有什么最佳方法可以避免while 循环?因为那会增加另一个循环。 mysqli_fetch_all 应该让我将所有行添加到 $arr1 但是每个 id 的键是一个索引(递增数字)而不是 list_id
    • 只要那个while循环没有查询或者其他繁重的任务,这样用绝对没问题。我把它放在答案中的方式可能是你能做到的最高性能。 mysqli_fetch_all 在内部做了类似的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2012-05-03
    • 2023-03-08
    • 2014-08-08
    • 2013-07-03
    相关资源
    最近更新 更多