3

これが私が行っていることです。顧客と注文の配列が1つあるので、これら2つのデータから新しい配列を作成しています...コードは次のとおりです。

カスタマーアレイ:

Array
(
    [0] => Array
        (
            [customerid] => 1234
            [name] => John Doe
            [email] => john@doe.com
        )

    [1] => Array
        (
            [customerid] => 4321
            [name] => Jane Smith
            [email] => jane@smith.com
        )

    (etc...)
)

Orders配列:

Array
(
    [0] => Array
        (
            [customerid] => 1234
            [amount] => 100.00
            [date] => 2012-05-11
        )

    [1] => Array
        (
            [customerid] => 4321
            [amount] => 200.00
            [date] => 2012-03-01
        )

    [2] => Array
        (
            [customerid] => 4321
            [amount] => 500.00
            [date] => 2012-02-22
        )

    (etc...)
)

最終的な配列:

Array
(
    [1234] => Array
        (
            [name] => John Doe
            [email] => john@doe.com
            [orders] => Array
                (
                    [0] => Array
                        (
                            [amount] => 100.00
                            [date] => 2012-05-11
                        )

                )

        )

    [4321] => Array
        (
            [name] => Jane Smith
            [email] => jane@smith.com
            [orders] => Array
                (
                    [0] => Array
                        (
                            [amount] => 200.00
                            [date] => 2012-03-01
                        )
                    [1] => Array
                        (
                            [amount] => 500.00
                            [date] => 2012-02-22
                        )

                )

        )

    (etc...)
)

だから...これは私が考えたPHPコードです:

$customers = array(blah...); # See above...
$orders    = array(blah...); # See above...
$new_array = array();

foreach ($customers as $c) {
  $new_array[$c['customerid']] = array(
    'name'   => $c['name'],
    'email'  => $c['email'],
    'orders' => array()
  );
}

foreach ($orders as $o) {
  $new_array[$o['customerid']]['orders'][] = array(
    'amount' => $o['amount'],
    'date'   => $o['date']
  );
}

最後に、この投稿のトピックにいます!これを最適化するためのヒントはありますか?または、最初は順調でした...それもいいでしょう...とにかく、私がそれらに従わないことを選んだとしても、どんなヒントもありがたいです...よろしくお願いします...

4

2 に答える 2

1

コメントで言ったように、それはうまく見えます。ただし、コードを短縮するためにできることの1つは、新しい配列を作成するときにすべてのフィールドについて再度言及しないことです。これにより、最終的に多くのフィールドがある場合に、入力をかなり節約できます。

たとえば、次の代わりに:

foreach ($customers as $c) {
  $new_array[$c['customerid']] = array(
    'name'   => $c['name'],
    'email'  => $c['email'],
    'orders' => array()
  );
}

あなたはただすることができます:

foreach ($customers as $c) {
  $new_array[$c['customerid']] = $c;
  $new_array[$c['customerid']]['orders'] = array();
}

通常、コードを時期尚早に最適化する理由はありません。必要に応じて、コードを機能させて最適化するだけです(もちろん、何が良いか、何が悪いかについての十分な基礎知識があると、そもそも高品質のコードを書くのに役立ちます)。

編集

あなたが本当にそれをより速くする方法に興味があるなら、それをする方法があります。たとえば、新しい配列を作成した後で元の2つの配列を気にする必要がない場合は、コードを少し変更して、不要な配列のコピーをすべて削除できます。PHPには内部参照カウントメカニズムがあり、割り当て時に配列のコピーは作成されませんが、後で実際に配列を変更した場合にのみ作成されます(これはコピーオンライトと呼ばれます)。例えば:

foreach ($customers as $c) {
  $new_array[$c['customerid']] = $c; // $c is not yet actually copied here, PHP just creates an internal reference to $c
  $new_array[$c['customerid']]['orders'] = array(); // this is what copies the underlying array, as it is now modified
}

このことを念頭に置いて、生成後に元の配列$customersと配列が変更されないままでいることを気にしない場合は、元の配列を変更するだけで、不要なコピーを防ぐことができます。$orders$new_array

// iterate through the array by reference
foreach ($customers as &$c) {
  $c['orders'] = array(); // modifies the original $customers array
  $new_array[$c['customerid']] = $c;
}

// clean up the reference, to prevent accidents later on
unset($c);

// there's no need to use a reference here, as PHP's internal refcounting mechanism will kick in
foreach ($orders as $o) {
  $new_array[$o['customerid']]['orders'][] = $o;
}

// finally if you don't need the original arrays anymore, clean up after them
// this also means that modifying $new_orders afterwards will not create a copy
// of anything, as $new_orders is the only array keeping internal references
// to the customers and orders
unset($customers, $orders);

しかし、繰り返しになりますが、このように時期尚早に最適化する必要はありません。クリーンで読みやすいコードを優先し、必要な場合にのみ最適化します。

于 2012-05-11T13:05:19.753 に答える
0

私はPHPの専門家ではありませんが、私には正しいように見えます。それ以上に最適化することはできません。また、時期尚早の最適化にも注意します。物事をスピードアップしようとする前に、コードを完全に機能させてください。これにより、将来の苦痛の世界を救うことができます。

于 2012-05-11T13:01:52.020 に答える