PHP 的数组非常灵活和有用。我在 PHP.net 数组参考页面上数了 30 多个数组函数。其中一些可以解决我的问题,但我正在寻找最好,最优雅的方式。
我有 2 个数组,称为 labor
和 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"函数之一,但最终完全混淆了。在放弃并编写自己的数组扫描功能之前,我想看看是否有任何想法可以解决我的问题,可能是 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]));
}