PHPで配列を取得し、MySQLでのLEFT JOINのようにそれらを「結合」するために、次のコードを記述しました。私のために、foreachを使用して関数を記述し、配列を渡して新しい配列を返しました...かなり読みやすいように感じますが、非効率的であることもわかっています。
理想的には、この関数が配列ごとに10,000行以上を処理することを望みます。つまり、1)参照によって$ originalを渡す(メモリを節約するため)、および2)foreachではなくPHP反復配列関数の1つを使用することを意味します。 (処理時間を節約するため)。
通常、このような「クイズ」のような質問は投稿しませんが、これに対する答えはコミュニティに役立つと思います。(この男のように:2つの多次元配列に参加します)
1)最速、2)メモリ消費量が最も少ない回答が勝ちますように!: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);