【问题标题】:Compare for existing values from 2 foreach loops?比较 2 个 foreach 循环的现有值?
【发布时间】:2015-04-11 15:46:00
【问题描述】:

我有 2 个 foreach 循环,我从第一个 db 获得新结果,我有第二个 foreach,我从第二个 db 获得数据

我的第一个 foreach 代码是:

foreach($_existing_data_result as $result) {
echo $result->name.'<br>';
}

第二次foreach:

foreach($_new_data_result as $resultNew) {
echo $resultNew->name.'<br>';
}

如果第一个结果存在,我需要检查第二个 foreach 然后忽略这个结果,我用in_array()尝试过,但我总是看到双名...

【问题讨论】:

  • @degr 如果您不知道答案,请不要尝试写。
  • 哦,对不起。您使用对象,而不是数组。因此,在第一个循环中定义数组,并为其添加值。然后使用 in_array()。

标签: php if-statement foreach


【解决方案1】:

第二次foreach,改成这样:

foreach($_new_data_result as $resultNew) {
    if (!in_array($resultNew,$_existing_data_result)) 
        echo $resultNew->name.'<br>';
}

假设整个 $resultNew 对象存在于 $_existing_data_result 中并且是相同的,这将起作用。

【讨论】:

  • 我这样做了,但我仍然得到相同的结果,这意味着我也看到了现有值。
  • @jExchange 这可能是因为对象不相等(两个对象相等,当它们具有相同的属性和相同的值时)。我的示例显示了整个对象的比较。如果您只想按名称检查它们,请查看 szapio 的答案。
【解决方案2】:
//Use array_diff instead. Like

$new_array = array_diff($_existing_data_result, $_new_data_result);

【讨论】:

  • 这么多内存浪费。也不是 OP 要求的。
【解决方案3】:

首先从第一个数组中获取所有名字:

$names = array_map(
         create_function('$object', 'return $object->name;'),
         $app_items);

然后在第二个 foreach 中检查名称是否存在于名称数组中:

foreach($_new_data_result as $resultNew) {
    if(!in_array($resultNew->name, $names) {
        echo $resultNew->name.'<br>';
    } 
}

【讨论】:

    【解决方案4】:
    $names = array();
    foreach($_existing_data_result as $result) {
        echo $result->name.'<br>';
        $names[$result->name] = 1;
    }
    
    foreach($_new_data_result as $resultNew) { 
        if (!isset($names[$resultNew->name])) {
            echo $resultNew->name.'<br>';  
        }
    }
    

    【讨论】:

    • 这个更好 - $names[] = $result->name;
    • @degr 为什么?当我将其作为值插入时,我必须使用 array_searchin_array 来检查是否使用了此名称,如果我将其用作键,我可以检查 isset($names[$key])) 我认为检查数组中的指定键是比为指定值搜索整个数组更快
    • in_array 的工作速度也很快,不如 isset 或 empty 快,但你不会感到有什么不同。但是,当您创建 assoc 数组时,您会花费更多内存 - 用于数组数据和数组 hashkeys 结构。
    • 在大多数情况下,您不会感到有什么不同,也不会丢失太多记忆,但这是“语义”问题。我更喜欢仅在必要时制作 assoc 数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2013-07-18
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多