2016-12-19 5 views
0

の配列をソートしながら、各項目に、合計のX項目を追加するための最良の方法は何か:オーダー内の個々の行の項目を表す項目の配列を指定したPHP

var_export([[ 
     'order_id' => 1, 
     'driver_id' => 100, 
     'product_id' => 2 
     ], 
     [ 
     'order_id' => 1, 
     'driver_id' => 100, 
     'product_id' => 1 
     ], 
     [ 
     'order_id' => 2, 
     'driver_id' => 50, 
     'product_id' => 1 
     ] 
]); 

driver_idによってソートされなければならないこと、次にproduct_id。最後に、私のようなものがあることを、このようなソート時に各項目に追加のフィールドを追加することが可能です:

sequenceは順序内の項目の反復回数を示し
var_export([[ 
     'order_id' => 2, 
     'driver_id' => 50, 
     'product_id' => 1, 
     'sequence' => '1 of 1' 
     ], 
     [ 
     'order_id' => 1, 
     'driver_id' => 100, 
     'product_id' => 1, 
     'sequence' => '1 of 2' //if easier, this could be 2 of 2 and the one below 1 of 2 as long as they are ordered this way in the array 
     ], 
     [ 
     'order_id' => 1, 
     'driver_id' => 100, 
     'product_id' => 2, 
     'sequence' => '2 of 2' 
     ] 
]); 

を(ORDER_ID 1は、2つの項目があります合計はそれぞれ2のシーケンスxを持たなければならないが、オーダー内のどのアイテムが1とマークされ、どのアイテムが2とマークされているかは重要ではない。

ソート中にこれを行うことができない場合、このフィールドを追加するにはどうすればよいですか?

+0

今後は、ソースデータを表示するために 'var_export'を使用してください。そうすればコピー貼り付けができます。 – sevavietl

+0

@sevavietl私はvar_exportを使用するように更新し、並べ替え順序をより明確に示すようにデータを変更しました。 –

答えて

0

は、あなたはそのような何かを試すことができます:ここでは

// Get array of all order ids. 
$orderIds = array_column($array, 'order_id'); 
// Sort $array by order ids. 
array_multisort(
    array_column($array, 'driver_id'), 
    array_column($array, 'product_id'), 
    $orderIds, 
    $array 
); 
// Count order ids occurances. 
$orderIdsCounts = array_count_values($orderIds); 

$counter = 0; 
$array = array_map(function ($orderId, $item) use (&$counter, $orderIdsCounts) { 
    $counter += 1; 

    $item['sequence'] = "$counter of {$orderIdsCounts[$orderId]}"; 

    // Reset the counter if order id total is reached. 
    $counter = $counter === $orderIdsCounts[$orderId] ? 0 : $counter; 

    return $item; 
}, $orderIds, $array); 

working demoです。

+0

シーケンスフィールドを取得して追加しますが、元の配列は並べ替えません。私は同時に両方を行うことが可能かどうか尋ねていた。元の配列を 'driver_id'、次に' product_id'で順序付けします。そのマップ関数を 'usort'に混ぜることができますか?それとも、私の望む結果を得るために2つの別々の繰り返しを行う必要があるのでしょうか? –

+0

@RobinSouthgate、多分あなたは一度にすべてを行うことができますが、これは本当にロジックを複雑にします。ですから、私は 'array_multisort'にさらに2つの引数を渡します。更新された回答を参照してください。 – sevavietl

関連する問題