[英]Alphabetically sort multidimensional array's keys and values recursively in PHP
我需要幫助按字母順序排列數組的鍵和值:
$unsorted = [
'D' => [
'C' => ['c', 'b', 'a'],
'B' => 'bvalue',
'A' => ['a', 'c', 'b'],
],
'C' => 'cvalue',
'B' => 'bvalue',
'A' => [
'Z' => 'zvalue',
'A' => 'avalue',
'B' => 'bvalue',
]
];
排序必須是遞歸的,因為上面的數組是多維的。 它將其他數組(數字索引和關聯)作為其值。
我設法使用此函數遞歸地對數組的鍵進行排序:
function sortKeysRecursive(&$array)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
sortKeysRecursive($value);
}
}
ksort($array);
}
但是,我無法在不弄亂已經排序的鍵的情況下對值進行排序。 要對值進行排序,我嘗試應用此函數:
function sortValuesRecursive(&$array)
{
foreach ($array as &$value) {
if (is_array($value)) {
sortValuesRecursive($value);
}
}
asort($value);
}
sortKeysRecursive($unsorted);
sortValuesRecursive($unsorted);
但它是一個或另一個。 兩個函數應用於同一個數組總是混亂其他函數工作。
我希望生成如下所示的排序數組:
$sorted = [
'A' => [
'A' => 'avalue',
'B' => 'bvalue',
'Z' => 'zvalue',
],
'B' => 'bvalue',
'C' => 'cvalue',
'D' => [
'A' => ['a', 'b', 'c'],
'B' => 'bvalue',
'C' => ['a', 'b', 'c'],
],
];
我很感激你的幫助。
你需要檢查鍵是數字還是字母。 嘗試以下解決方案,您可能需要為您的目的修改條件:
<?php
function isAssoc(array $arr)
{
return array_keys($arr) !== range(0, count($arr) - 1);
}
function sortArray(&$arr){
if(isAssoc($arr)){
ksort($arr);
} else{
asort($arr);
}
foreach ($arr as &$a){
if(is_array($a)){
sortArray($a);
}
}
}
$unsorted = array(
'D' => array(
'C' => array('c', 'b', 'a'),
'B' => 'bvalue',
'A' => array('a', 'c', 'b'),
),
'C' => 'cvalue',
'B' => 'bvalue',
'A' => array(
'Z' => 'zvalue',
'A' => 'avalue',
'B' => 'bvalue',
)
);
sortArray($unsorted);
print_r($unsorted);
產量
Array
(
[A] => Array
(
[A] => avalue
[B] => bvalue
[Z] => zvalue
)
[B] => bvalue
[C] => cvalue
[D] => Array
(
[A] => Array
(
[0] => a
[2] => b
[1] => c
)
[B] => bvalue
[C] => Array
(
[2] => a
[1] => b
[0] => c
)
)
)
使用以下方法並循環遍歷$unsorted
數組並有條件地排序:
function recursiveSort(array &$unsorted) {
// Sort array keys
ksort($unsorted);
foreach ($unsorted as $key => $array) {
if (!is_array($array)) {
continue;
}
if (is_numeric(key($array))) {
asort($array);
} else {
recursiveSort($array);
}
$unsorted[$key] = $array;
}
}
用法:
recursiveSort($unsorted);
希望能幫助到你
function sortKeysRecursive(&$array)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
sortKeysRecursive($value);
}
}
ksort($array);
}
/**
* Sort only the arrays that doesn't have a child array, this way
* we don't mess with what sortKeysRecursive has sorted
*/
function sortValuesRecursive(&$array)
{
$isArray = false;
foreach ($array as $key => &$value) {
if (is_array($value)) {
$isArray = true;
sortValuesRecursive($value);
}
}
if ($isArray === false) {
asort($array);
}
}
sortKeysRecursive($unsorted);
sortValuesRecursive($unsorted);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.