在PHP中对多键数组进行排序

时间:2014-08-12 04:50:32

标签: php

我找到了关于排序多维数组的几个答案,但没有一个是我拥有的数组类型。

我的数组看起来像这样:

$data[1][1][1] = 100; // 1,1,1
$data[1][1][2] = 120; // 1,1,2 
$data[1][2][1] = 140; // 1,2,1 
// Several hundred permutations to follow.

要分类到......

$data[1][2][1] = 140; // 140 is higher than 120.. etc. 
$data[1][1][2] = 120;
$data[1][1][1] = 100;

如何根据数据对数据进行排序,并返回密钥?

2注意事项:尺寸实际上是无限的,一些数组键是字符串,而不仅仅是数字。例如$ data [1] [" type"] [1] = 100; 谢谢。

顺便说一下..我已经尝试了几种组合,没有成功......

1 个答案:

答案 0 :(得分:0)

这是不可能的,因为多级别数组没有一个订单。每个子阵列都有自己的顺序。例如。

$data[1][1][1] = 100; 
$data[1][1][2] = 140; 
$data[1][2][1] = 120; 

应该返回

$data[1][1][1] = 100; 
$data[1][2][1] = 120; 
$data[1][1][2] = 140; 

但整个数组$data[1][2]应该在整个$data[1][1]之后或之前,而不是在同一时间。

但是如果你想对值进行排序并保持键(但结构会有所不同),你可以使用这段代码。

$data[1][1][1] = 100;
$data[1][1][2] = 140;
$data[1][2][1] = 120;

function getValue($array, array &$sortable_array = null, $keys = array())
    {
    foreach ($array as $key => $item)
        {
        $current_keys = array_merge($keys, [$key]);
        if (is_array($item))
            getValue($item, $sortable_array, $current_keys);
        else
            {
            $sortable_array[] = ['value' => $item, 'keys' => $current_keys];
            }
        }
    }

getValue($data, $sortable_array);

usort($sortable_array, function($a, $b)
    { return $a > $b ? -1 : 1; });

// print_r($sortable_array);

// debug output    
array_map(function($e)
    { echo json_encode($e) . PHP_EOL; }, $sortable_array);

//{"value":140,"keys":[1,1,2]}
//{"value":120,"keys":[1,2,1]}
//{"value":100,"keys":[1,1,1]}