Php 如何优化我的数组连接(模拟左连接)函数?

Php 如何优化我的数组连接(模拟左连接)函数?,php,Php,我编写了以下代码,在PHP中获取数组,并像在MySQL中使用左连接一样将它们“连接”在一起。为了我的缘故,我使用foreach编写了函数,传入数组并返回了一个新数组。。。我觉得它可读性很强,但我也知道它效率低下 理想情况下,我希望这个函数能够处理每个数组多达10000行,我猜想这意味着:1)通过引用传递$original(以节省内存),2)使用PHP迭代数组函数而不是foreach(以节省处理时间) 通常我不会发布这些类似于“测验”的问题,但我觉得这个问题的答案将有益于社区。(就像这个家伙:)

我编写了以下代码,在PHP中获取数组,并像在MySQL中使用左连接一样将它们“连接”在一起。为了我的缘故,我使用foreach编写了函数,传入数组并返回了一个新数组。。。我觉得它可读性很强,但我也知道它效率低下

理想情况下,我希望这个函数能够处理每个数组多达10000行,我猜想这意味着:1)通过引用传递$original(以节省内存),2)使用PHP迭代数组函数而不是foreach(以节省处理时间)

通常我不会发布这些类似于“测验”的问题,但我觉得这个问题的答案将有益于社区。(就像这个家伙:)

愿最快、消耗内存最少的答案获胜!:P

<?php

// Join Arrays on Keys (**updated with knittl's suggestion**)
function array_join($original, $merge, $on) {
    if (!is_array($on)) $on = array($on);
    foreach ($merge as $remove => $right) {
        foreach ($original as $index => $left) {
            foreach ($on as $from_key => $to_key) {
                if (!isset($original[$index][$from_key])
                    || !isset($right[$to_key])
                    || $original[$index][$from_key] != $right[$to_key])
                    continue 2;
            }
            $original[$index] = array_merge($left, $right);
            unset($merge[$remove]);
        }
    }
    return array_merge($original, $merge);
}

// Test Arrays
$data1 = array(
    array(
        'productId' => '822335',
        'dateHour' => '2011-11-17 06:00:00',
        'qtySold' => '200',
        'qtyCanceled' => '10',
    ),
    array(
        'productId' => '822335',
        'dateHour' => '2011-11-17 07:00:00',
        'qtySold' => '100',
        'qtyCanceled' => '20',
    ),
    array(
        'productId' => '822336',
        'dateHour' => '2011-11-17 06:00:00',
        'qtySold' => '0',
        'qtyCanceled' => '30',
    ),
    array(
        'productId' => '822336',
        'dateHour' => '2011-11-17 07:00:00',
        'qtySold' => '50',
        'qtyCanceled' => '40',
    ),
);

$data2 = array(
    array(
        'entity_id' => '822335',
        'dateHour' => '2011-11-17 06:00:00',
        'productInventory' => '300',
    ),
    array(
        'entity_id' => '822335',
        'dateHour' => '2011-11-17 07:00:00',
        'productInventory' => '200',
    ),
    array(
        'entity_id' => '822336',
        'dateHour' => '2011-11-17 06:00:00',
        'productInventory' => '100',
    ),
    array(
        'entity_id' => '822336',
        'dateHour' => '2011-11-17 07:00:00',
        'productInventory' => '50',
    ),
);

// Usage
$result = array_join($data1, $data2, array(
    'productId' => 'entity_id',
    'dateHour' => 'dateHour'
));
print_r($result);
更好吗

function array_join($original, $merge, $on) {
    if (!is_array($on)) $on = array($on);
    foreach ($merge as $remove => $right) {
        foreach ($original as $index => $left) {
            foreach ($on as $from_key => $to_key) {
                if (!isset($original[$index][$from_key])
                || !isset($right[$to_key])
                || $original[$index][$from_key] != $right[$to_key])
                    continue 2;
            }
            $original[$index] = array_merge($left, $right);
            unset($merge[$remove]);
        }
    }
    return array_merge($original, $merge);
}

在最里面的foreach+if中添加一个
break
,这将大大加快执行速度。下面是三种“基本”的连接技术:
循环
散列
合并
。上面哪一个?其他人如何工作?每一个的大O是什么?@knittl:不幸的是,打破任何一个foreach都会阻止多键匹配工作。@CalebGray:
foreach($from_key=>$to_key){如果(!isset…$match=false;}
你永远不会将
$match
改回TRUE。因此,将其更改为
{$match=FALSE;break;}
肯定会有所帮助。很多使用
继续语句跳过外循环的一次迭代甚至有助于节省状态变量(
$match
)。@knittl:哦,你完全正确!哈!我在重读我的实现之前讲了话。我会更新我的问题^_^令人惊叹的!看起来你的优化就是我想要的^_^@knittl为什么要返回array\u merge($original,$merge)而不是仅仅返回$original@CalebGray^^如果你知道answer@Nathan字体差不多4年后,我真的说不出话来了。它将添加仍留在
$merge
数组中的所有键。