【问题标题】:How to check if a similar array exists in another array of arrays如何检查另一个数组数组中是否存在类似的数组
【发布时间】:2017-05-22 15:05:36
【问题描述】:

我有一个包含时间和 ID 的数组,我正在向它添加具有不同 ID 的新时间,我需要先检查它是否存在。例如。

第一个数组

$times = array(
    array('start'=>"1:00","end"=>"1:59","id"=>1),
    array('start'=>"2:00","end"=>"2:59","id"=>1),
    array('start'=>"3:00","end"=>"3:59","id"=>1),
    array('start'=>"4:00","end"=>"4:59","id"=>1),
    array('start'=>"5:00","end"=>"5:59","id"=>1),
    array('start'=>"6:00","end"=>"6:59","id"=>1)
);

需要做的

$time = array('start'=>"2:00","end"=>"2:59","id"=>2);
if(!in_array($time,$times){ // here is the problem 
    array_push($times,$time);
}

这不是重复的,因为它与键/值对无关,因为它总是相同的,它具有相同的键/值对,但检查一个新元素 - 无论其 id 键值如何 - 已经存在于数组中

【问题讨论】:

    标签: php arrays loops


    【解决方案1】:

    由于id 的键不同,不能直接使用数组比较函数和运算符。我建议简单地迭代数组并比较键:

    $found = false;
    foreach ($times as $key => $t) {
      if ($t['start'] == $x['start'] && $t['end'] == $x['end']) {
        $found = true;
        $times[$key] = $x;
        break;
      }
    }
    
    if (!$found) {
      $times[] = $x;
    }
    

    如果字段的数量很大,甚至是未知的,您可以创建一个未设置 id 字段的临时数组,并使用比较运算符进行比较:

    $tmp_x = $x;
    unset($tmp_x['id']);
    
    $found = false;
    foreach ($times as $key => $t) {
      $tmp_t = $t;
      unset($tmp_t['id']);
    
      if ($tmp_t == $tmp_x) {
        $found = true;
        $times[$key] = $x;
        break;
      }
    }
    

    【讨论】:

    • 这实际上解决了问题,但随后又出现了“效率”问题,因为这里的 $time 只是一个示例,而真正发生的事情是我已经在进行嵌套以获得 $times 然后向它添加新的时间,这意味着 cpu 的额外负载......但我会接受解决方案,因为它修复了它:D
    • @YamenImadNassif,嗯。如果项目数量很大,则需要更高效的搜索算法,例如binary search,或者更好。或者,您可以使用基于内存的数据库(例如 Redis,或带有 MEMORY 引擎的 MySQL 表)。
    • 我将暂时使用解决方案,因为我需要一个快速的解决方案,并且会提供更高效的解决方案 - 如果我找到了 - 稍后谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多