1

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

我有 2 个数组,称为laborand cost,每个数组都包含一个表:

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”函数,但最终完全混淆了。在放弃并编写自己的数组扫描函数之前,我想看看是否有任何想法可以解决我的 1 行,可能 2 行代码的问题。

4

2 回答 2

2

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

这里有一些例子:

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)会更有效。

于 2012-04-09T15:29:10.520 回答
0

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

$merge = array();

for ($i = 0; $i < count($labor); $i++) {
    array_push($merge, array_merge($labor[$i],$cost[$i]));
}
于 2012-04-09T15:05:07.203 回答