相交嵌套数组时要使用的最佳 PHP 数组函数是什么


What's the best PHP array function to use when intersecting nested arrays?

PHP 的数组非常灵活和有用。我在 PHP.net 数组参考页面上数了 30 多个数组函数。其中一些可以解决我的问题,但我正在寻找最好,最优雅的方式。

我有 2 个数组,称为 laborcost ,每个数组包含一个表:

labor = array(
   0 => array('date' => date, 'labor'=> labor), 
   1 => array('date' => date, 'labor'=> labor),
   ...
);
cost = array(
   0 => array('date' => date, 'cost'=> cost), 
   1 => array('date' => date, 'cost'=> cost),
   ...
);

我的问题是有时日期的数量不匹配(即,有些日子你产生了成本,即使你没有花任何劳动力,或者你有劳动力但没有成本的日子) - 这意味着一个数组中有更多的行然后下一个 - 没有办法知道哪个有不使用count()

我感兴趣的只是那些既有劳动力又有成本的日子,我想最终得到一个数组:

laborcost = array(
   0 => array('date' => date, 'labor'=> labor, 'cost' => cost), 
   1 => array('date' => date, 'labor'=> labor, 'cost' => cost),
   ...
)

我想过使用array_intersect()或"u"函数之一,但最终完全混淆了。在放弃并编写自己的数组扫描功能之前,我想看看是否有任何想法可以解决我的问题,可能是 2 行代码。

没有交叉函数接受允许用户修改数组的用户定义的比较函数。最简单的方法就是自己动手。

以下是一些示例:

O(2n + m)

// Remap dates as keys for faster lookups
$result = $nlabor = $ncost = array();
foreach ($labor as $l) $nlabor[$l['date']] = $l;
foreach ($cost as $c) $ncost[$c['date']] = $c;
// Compare
foreach ($nlabor as $date => $l) {
    if (array_key_exists($date, $ncost)) {
        $result[] = array_merge($l, $ncost[$date]);
    }
}

~O(n * m)

// Just compare them all
$result = array();
foreach ($labor as $l) {
    foreach ($cost as $c) {
        if ($l['date'] == $c['date']) {
            $result[] = array_merge($l, $c);
            break;
        }
    }
}

哪种方式最好取决于每个数组中有多少个元素。当在较小的阵列上使用时,~O(n * m)是可以的,而在较大的阵列上,O(2n + m)会更有效。

这应该可以做到这一点。不像单个函数那么简单。

$merge = array();
for ($i = 0; $i < count($labor); $i++) {
    array_push($merge, array_merge($labor[$i],$cost[$i]));
}