1

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),
   ...
)

または「u」関数の1つを使用することを考えましarray_intersect()たが、完全に混乱してしまいました。自分の配列スキャン関数をあきらめて書く前に、1行、場合によっては2行のコードで問題を解決するアイデアがあるかどうかを確認したいと思いました。

4

2 に答える 2

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)の方が効率的です。

于 2012-04-09T15:29:10.520 に答える
0

これはそのトリックを行う必要があります。単一の関数ほど単純ではありません。

$merge = array();

for ($i = 0; $i < count($labor); $i++) {
    array_push($merge, array_merge($labor[$i],$cost[$i]));
}
于 2012-04-09T15:05:07.203 に答える