web-dev-qa-db-ja.com

多次元配列を特定のサブ配列値でグループ化する方法は?

多次元配列があり、特定の列の値に従ってグループ化しようとしています。

levelでグループ化しようとしていますが、実際のレベルは事前にはわかりません。つまり、forループに入れてwhile $i < 7と言うことができるわけではありません。7がレベルキーの最大値であることを知らないためです。私がそうしたとしても、それが私がそれをする必要がある方法であるかどうかわかりません...

Array (
   [0] => Array (
          [cust] => XT8900
          [type] => standard
          [level] => 1
          )
   [1] => Array (
          [cust] => XT8944
          [type] => standard
          [level] => 1
          )
   [2] => Array (
          [cust] => XT8922
          [type] => premier
          [level] => 3
          )
   [3] => Array (
          [cust] => XT8816
          [type] => permier
          [level] => 3
          )
   [4] => Array (
          [cust] => XT7434
          [type] => standard
          [level] => 7
          )
)

私が作りたいもの:

Array (

   [1] => Array (
          [0] => Array (
                    [cust] => XT8900
                    [type] => standard
                    )
          [1] => Array (
                    [cust] => XT8944
                    [type] => standard
                    )
          )

   [3] => Array (
          [2] => Array (
                 [cust] => XT8922
                 [type] => premier
                 )

          [3] => Array (
                 [cust] => XT8816
                 [type] => permier
                 )
          )

   [7] => Array (
          [4] => Array (
                 [cust] => XT7434
                 [type] => standard
                 )
          )
)
28
n00b0101

まずレベルでグループ化する必要があります

foreachを使用して配列レベルにループし、レベルが前のアイテムと同じかどうかを確認してから、その配列でグループ化します

  $templevel=0;   

  $newkey=0;

  $grouparr[$templevel]="";

  foreach ($items as $key => $val) {
   if ($templevel==$val['level']){
     $grouparr[$templevel][$newkey]=$val;
   } else {
     $grouparr[$val['level']][$newkey]=$val;
   }
     $newkey++;       
  }
print($grouparr);

print($ grouparr);の出力は、希望する形式のように表示されます

あなたもしようとすることができます

print($grouparr[7]);

表示されます

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )

または

print($grouparr[3]);

表示されます

[3] => Array (
      [2] => Array (
             [cust] => XT8922
             [type] => premier
             )

      [3] => Array (
             [cust] => XT8816
             [type] => permier
             )
      )
10
Gerard Banasig

最善の方法は、初期配列の作成を制御できる場合は、エントリを追加するときに、最初にそのように設定するだけです。

そうでない場合は、一時配列を作成してソートします。

foreach ($input_arr as $key => &$entry) {
    $level_arr[$entry['level']][$key] = $entry;
}

必要なフォームとすべてのリファレンスを一緒に参照できます。

可能であれば、そもそもそのような配列を構築します。

38
Mike
function group_assoc($array, $key) {
    $return = array();
    foreach($array as $v) {
        $return[$v[$key]][] = $v;
    }
    return $return;
}

//Group the requests by their account_id
$account_requests = group_assoc($requests, 'account_id');
7
Farzher

これは、関数としてラップされた、同じ問題の解決策です。

function arraySort($input,$sortkey){
  foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val;
  return $output;
}

$ myarrayを「レベル」というキーでソートするには、次のようにします。

$myArray = arraySort($myArray,'level');

または、関数として使用したくない場合は、一度だけ使用すると、キー 'level'でグループ化された$ myArrayから$ myNewArrayが作成されます

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
5
Kevin Hagerty

最高の回答。

    $levels = array_unique(array_column($records, 'level'));

    $data = array();

    foreach($records as $key => $value){ 

    $data[$levels[array_search($value['level'],$levels )]][] = $value ; 

    }

    print_r($data); 
0
VIPAN KUMAR
  $result = array();
    foreach ($yourArrayList as $data) {
        $id = $data['level'];
        if (isset($result[$id])) {
            $result[$id][] = $data;
        } else {
            $result[$id] = array($data);
        }
    }
0
user4155960