解决一个问题会产生另一个问题...... 我已经根据映射数组更新了数组键,但是它将新映射的键移动到数组的底部。我需要元素列表底部的子数组。
重命名键后,数组的截断片段如下所示:
0 =>
array (
'category' => 'Sink',
'sublineitems' =>
array (
0 =>
array (
'quantity' => 1,
'model' => 'PBMS2016-12-X',
'customerspecificpricings' =>
array (
),
'electricalutilitygrids' =>
array (
),
'plumbingutilitygrids' =>
array (
0 =>
array (
'remarks' => '3-1/2" drain opening',
),
),
'subline_item_id' => '844b7c74-b1b7-4f17-a2da-f0c84cef432d',
'item_type_code' => 0,
'item_type_description' => 'Normal',
'vendor_id' => '4e1ab2ef-774e-4c73-be60-c937d1efeb56',
),
),
'lineitem_id' => 'e592feab-1e1a-4cfc-a97a-f1108c7156b6', *** needs to follow 'category' ***
'item_number' => '1', *** needs to follow 'lineitem_id' ***
),
非数字子数组的键用作表名。迭代数组时,在“lineitem_id”和“item_number”之前遇到“sublineitems”子数组。我需要对元素重新排序,以便子数组位于数组/子数组中的其他元素之后。数组嵌套了 6-8 个数组,并且所有数组的键名称都不相同。
我尝试过 array_map(array_values)、array_multisort、json_encode/decode。订单不受影响。
期望的结果是一个将非数组元素分组在每个数组/子数组顶部的数组。
array (
'category' => 'Mop Sink',
'lineitem_id' => 'e592feab-1e1a-4cfc-a97a-f1108c7156b6',
'item_number' => '1',
'sublineitems' =>
array (
0 =>
array (
'quantity' => 1,
'model' => 'PBMS2016-12-X',
'cube' => 4.0,
'width' => 24.63,
'depth' => 19.38,
'height' => 16.0,
'gtin' => 'null|null|null',
'subline_item_id' => '844b7c74-b1b7-4f17-a2da-f0c84cef432d',
'item_type_code' => 0,
'item_type_description' => 'Normal',
....
'customerspecificpricings' =>
array (
),
'electricalutilitygrids' =>
array (
),
'plumbingutilitygrids' =>
array (
0 =>
array (
'remarks' => '3-1/2" drain opening',
),
),
'gassteamutilitygrids' =>
array (
),
'hvacutilitygrids' =>
array (
),
使用递归方法对每个级别的数据类型进行排序。
我的代码片段将通过引用进行修改(函数不会“返回”数组)。
代码:(演示)
function sortByDataTypeRecursive(array &$array)
{
uasort($array, fn($a, $b) => is_array($a) <=> is_array($b));
//asort($array); <-- this is slightly different because it implement a more complex sort on values
foreach ($array as &$v) {
if (is_array($v)) {
(__FUNCTION__)($v);
}
}
}
sortByDataTypeRecursive($array);
var_export($array);