1, "id" => 1, "index" => 1, "amount" => 50000), (1) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000), (2) => array("level" => 1,"> 1, "id" => 1, "index" => 1, "amount" => 50000), (1) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000), (2) => array("level" => 1,"> 1, "id" => 1, "index" => 1, "amount" => 50000), (1) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000), (2) => array("level" => 1," />

どのようにマージし、PHPの配列をカスタムまたはユーザー定義の基準で並べ替える?

私は2つの配列を持っています:

$data1 = array( 
        (0) => array("level" => 1, "id" => 1, "index" => 1, "amount" => 50000),
        (1) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000),
        (2) => array("level" => 1, "id" => 3, "index" => 1, "amount" => 0));  

$data2 = array( 
        (0) => array("level" => 2, "id" => 1, "index" => 1, "amount" => 30000),
        (1) => array("level" => 2, "id" => 1, "index" => 2, "amount" => 20000),
        (2) => array("level" => 2, "id" => 2, "index" => 1, "amount" => 15000),
        (3) => array("level" => 2, "id" => 2, "index" => 2, "amount" => 25000),
        (4) => array("level" => 2, "id" => 3, "index" => 1, "amount" => 0));

これらの配列を1つの配列にマージしたいのですが、その結果は次のようになります:

$expected = array(
         (0) => array("level" => 1, "id" => 1, "index" => 1, "amount" => 50000),
         (1) => array("level" => 2, "id" => 1, "index" => 1, "amount" => 30000),
         (2) => array("level" => 2, "id" => 1, "index" => 2, "amount" => 20000),
         (3) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000),
         (4) => array("level" => 2, "id" => 2, "index" => 1, "amount" => 15000),
         (5) => array("level" => 2, "id" => 2, "index" => 2, "amount" => 25000));

私は array_merge_recursive を使ってみました:

$try = array_merge_recursive($data1, $data2);  

しかし結果は次のようなものです:

$try = array(
         (0) => array("level" => 1, "id" => 1, "index" => 1, "amount" => 50000),
         (1) => array("level" => 1, "id" => 2, "index" => 1, "amount" => 40000),
         (3) => array("level" => 1, "id" => 3, "index" => 1, "amount" => 0),
         (4) => array("level" => 2, "id" => 1, "index" => 1, "amount" => 30000),
         (5) => array("level" => 2, "id" => 1, "index" => 2, "amount" => 20000),             
         (6) => array("level" => 2, "id" => 2, "index" => 1, "amount" => 15000),
         (7) => array("level" => 2, "id" => 2, "index" => 2, "amount" => 25000),
         (8) => array("level" => 2, "id" => 3, "index" => 1, "amount" => 0));

私は私の結果の基準を持っています:

  1. 量= 0の配列を削除する
  2. ID、レベル、インデックスによる並べ替えと並べ替え

私は、 uasort usort しかし、私は必要なものと一致するようにその関数を実装する方法はありません。その関数(uasort/usort)はそれを解決することができますか他のアイデアですか?ありがとう!

0
追加された 著者 hakre,
私は私の質問で言うように、配列をソートするために usort uasort を使うことについて多くの参考文献があると知っていますが、だから私はここでその質問をする。 @decezeに感謝してくれました。
追加された 著者 Arif RH,

2 答え

$data = array_merge($data1, $data2);
$data = array_filter($data, function ($d) {
    return $d['amount'] != 0;
});
usort($data, function ($a, $b) {
    if ($a['id'] != $b['id'])       return $a['id'] - $b['id'];
    if ($a['level'] != $b['level']) return $a['level'] - $b['level'];
    else                            return $a['index'] - $b['index'];
});

注:PHP 5.3以降の匿名関数の構文を使用します。

3
追加された
私は $ a / $ b の引数を後方に持っているかもしれないことに注意してください。単に減算の値を切り替える必要があるかもしれません... :)
追加された 著者 deceze,
素晴らしい答え! usortメソッドの基準を減ずることのスマートな使用。
追加された 著者 Jeune,
それは完璧に動作し、多くの@decezeに感謝!
追加された 著者 Arif RH,

これはあなたのために働きますか?

$finalArr = array_merge($data1,$data2);

foreach($finalArr as $key => $val) {
    if(empty($val['amount'])) {
        unset($finalArr[$key]);
    }
}
echo "
";
sort($finalArr);
print_r($finalArr);

Hope it helps

1
追加された
それは動作しますが、空の量を削除するためだけに、 id、level、index でソートして並べ替えません。とにかく助けてくれてありがとう。
追加された 著者 Arif RH,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com