按字母顺序排序多维数组';在PHP中递归地调用s键和值
我需要帮助按字母顺序排列以下数组的键和值:按字母顺序排序多维数组';在PHP中递归地调用s键和值,php,arrays,sorting,recursion,multidimensional-array,Php,Arrays,Sorting,Recursion,Multidimensional Array,我需要帮助按字母顺序排列以下数组的键和值: $unsorted = [ 'D' => [ 'C' => ['c', 'b', 'a'], 'B' => 'bvalue', 'A' => ['a', 'c', 'b'], ], 'C' => 'cvalue', 'B' => 'bvalue', 'A' => [ 'Z' => 'zvalue',
$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);
但是,我无法对值进行排序,而不会弄乱已排序的键。要对我尝试应用此函数的值进行排序,请执行以下操作:
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'],
],
];
我将非常感谢您的帮助。使用以下方法,在
$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);
<?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@RomanPerekhrest我已经包含了预期结果的视图。如果两个条件只是导致同一元素的顺序不同,那么您不能一个接一个地按这两个条件进行排序,也不能期望这不会把事情搞砸。如果按键对上层进行排序,那么以后再按值对同一层进行排序是没有意义的。@CBroe我同意。我想也许我可以让这些方法在不同的元素上工作。按字母顺序排列的值实际上只适用于条目数组中的数字数组,例如,
['c',b',a'],
,然后您需要找到区分这两种情况的方法。或者去检查你在当前关卡上有什么类型的钥匙;或者,检查当前数组中的项是数组本身还是标量值就足够了…?我发现这个解决方案适用于我尝试过的所有数组布局。非常感谢。