什么';当与嵌套数组相交时,最好使用哪种PHP数组函数?
PHP的数组非常灵活和有用。我数了30多个数组函数。其中一些可以解决我的问题,但我正在寻找最好、最优雅的方法 我有两个数组,分别称为什么';当与嵌套数组相交时,最好使用哪种PHP数组函数?,php,arrays,intersect,Php,Arrays,Intersect,PHP的数组非常灵活和有用。我数了30多个数组函数。其中一些可以解决我的问题,但我正在寻找最好、最优雅的方法 我有两个数组,分别称为人工和成本,每个数组包含一个表: labor = array( 0 => array('date' => date, 'labor'=> labor), 1 => array('date' => date, 'labor'=> labor), ... ); cost = array( 0 => a
人工
和成本
,每个数组包含一个表:
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\u intersect()
或其中一个'u'函数,但最终完全搞砸了。在放弃并编写自己的数组扫描函数之前,我想看看是否有任何想法可以用1行(可能是2行)代码来解决我的问题。这应该可以做到这一点。没有单个函数那么简单
$merge = array();
for ($i = 0; $i < count($labor); $i++) {
array_push($merge, array_merge($labor[$i],$cost[$i]));
}
$merge=array();
对于($i=0;$i<计数($人工);$i++){
数组推送($merge,数组推送($人工[$i],$cost[$i]));
}
没有接受用户定义的比较函数的intersect函数,该函数允许您修改数组。最简单的方法就是自己动手
以下是几个例子:
O(2n+m)
~O(n*m)
哪种方式最好取决于每个数组中有多少个元素。在较小的阵列上使用~O(n*m)可以,而在较大的阵列上,O(2n+m)将更有效。是的,
array\u map
。我将创建一个类,向构造函数提供一个数组,存储它,然后在类中使用另一个方法作为array\u map
的回调,可以向其提供第二个数组。尚未查看array\u map-将查看它。谢谢re:array_map-用户函数只接受一个参数-数组元素。如果我想将它与另一个数组中的键进行比较,这是不容易做到的。如何将数据引入用户函数(不使用全局变量)?没有帮助-如果成本比人工长怎么办?如果日期不匹配怎么办?我只需要匹配的日期,而不仅仅是一个合并的数组。好吧,这并不能真正解决我想要使用PHP内置数组函数的问题,但是你应该得到计算的答案:)没有内置函数来做你想做的事情。所有的array\u*
函数都不允许您修改数组,而array\u map
和array\u walk
基本上会做与上述相同的事情,但方式更复杂。
// 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]);
}
}
// 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;
}
}
}