什么';当与嵌套数组相交时,最好使用哪种PHP数组函数?

什么';当与嵌套数组相交时,最好使用哪种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

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

我有两个数组,分别称为
人工
成本
,每个数组包含一个表:

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;
        }
    }
}