将未知深度的多维数组减少为具有关联行的索引数组

问题描述 投票:0回答:1

我有一个深度不确定的多维数组,需要将其缩减为二维数组(关联行的索引数组)。

array:5 [▼
  0 => array:3 [▼
    "id" => 2
    "level" => 0
    "email" => "[email protected]"
  ]
  1 => array:2 [▼
    0 => array:3 [▼
      "id" => 4
      "level" => 1
      "email" => "[email protected]"
    ]
    1 => array:2 [▼
      0 => array:3 [▼
        "id" => 5
        "level" => 2
        "email" => "[email protected]"
      ]
      1 => array:1 [▼
        0 => array:3 [▼
          "id" => 6
          "level" => 3
          "email" => "[email protected]"
        ]
      ]
    ]
  ]
  2 => array:3 [▼
    "id" => 3
    "level" => 0
    "email" => "[email protected]"
  ]
  4 => array:3 [▼
    "id" => 7
    "level" => 0
    "email" => "[email protected]"
  ]
  5 => array:2 [▼
    0 => array:3 [▼
      "id" => 8
      "level" => 1
      "email" => "[email protected]"
    ]
    1 => array:2 [▼
      0 => array:3 [▼
        "id" => 9
        "level" => 2
        "email" => "[email protected]"
      ]
      1 => array:2 [▼
        0 => array:3 [▼
          "id" => 10
          "level" => 3
          "email" => "[email protected]"
        ]
        1 => array:2 [▼
          0 => array:3 [▼
            "id" => 11
            "level" => 4
            "email" => "[email protected]"
          ]
          1 => array:1 [▼
            0 => array:3 [▼
              "id" => 12
              "level" => 5
              "email" => "[email protected]"
            ]
          ]
        ]
      ]
    ]
  ]
]

我想清理上面的数组并获得如下所示的二维数组(截断):

array:3 [▼
  0 => array:3 [▼
    "id" => 1
    "level" => 2
    "email" => "[email protected]"
  ]
  1 => array:3 [▼
    "id" => 2
    "level" => 5
    "email" => "[email protected]"
  ]
  2 => array:3 [▼
    "id" => 1
    "level" => 8
    "email" => "[email protected]"
  ],
  ...
]

理想情况下,我希望结果按

id
排序。

如果重要的话,我的项目正在 Laravel8 上运行。

php arrays laravel recursion multidimensional-array
1个回答
0
投票

为了确保您的关联子数组在展平时不会被解构,仅扩展未索引的数组。将

$row
包裹在父数组内部,这样当它被
...
扩展时,原始数据行将保持完整。

将结构减少到 2 级后进行排序。

代码:(演示

function flattenList(array $array): array
{
    $result = [];
    foreach ($array as $row) {
        array_push($result, ...array_is_list($row) ? flattenList($row) : [$row]);
    }
    return $result;
}

$flatten2d = flattenlist($array);
usort($flatten2d, fn($a, $b) => $a['id'] <=> $b['id']);
var_export($flatten2d);
© www.soinside.com 2019 - 2024. All rights reserved.