PHP:排序多阵列结果

时间:2012-09-08 20:36:23

标签: php sorting multidimensional-array

  

可能重复:
  How do I sort a multidimensional array in php

Array ( [0] => Array ( 
                    [card_name] => CardA 
                    [str] => 10 
                    [def] => 10 
                    [desc] => - Recover 150 points of vitality 
                              - Attack twice" 
                    [qty] => 5 
                ) 
    [1] => Array ( 
                    [card_name] => CardD 
                    [str] => 40 
                    [def] => 40 
                    [desc] => - Investigate enemy's weakpoint 
                    [qty] => 3 
                ) 
    [2] => Array ( [card_name] => CardG 
                   [str] => 35 
                   [def] => 20 
                   [desc] => 
                   [qty] => 1 
                ) 
    [3] => Array ( 
                   [card_name] => CardH 
                   [str] => 25 
                   [def] => 30 
                   [desc] => 
                   [qty] => 1 
                ) 
    [4] => Array ( 
                   [card_name] => CardI 
                   [str] => 15 
                   [def] => 40 
                   [desc] => - Enhance strength 
                   [qty] => 1 
                ) 
    [5] => Array ( 
                   [card_name] => CardJ 
                   [str] => 5 
                   [def] => 50 
                   [desc] => - Make silence 
                   [qty] => 3 
                   ) 
    )

我有一个关于排序数组的简单问题。我只想通过str或def在asc或desc中对数组进行排序。 php.net中的例子有点令人困惑,我想知道是否有人能解决这个小难题。

我知道我应该使用array_multi_sort。

感谢。

4 个答案:

答案 0 :(得分:0)

尝试使用php usort - http://www.php.net/manual/en/function.usort.php

我没有试过并运行代码,但它将是以下内容:

function cmp($a, $b)
{
   return strcmp($a['def'],$b['def']) 
}

$a = yourArray[];

usort($a, "cmp");

这将迭代每个元素并将数组元素作为参数传递,并将使用您的自定义函数进行排序。

答案 1 :(得分:0)

使用usort功能。在你的情况下会是这样的:

function compare($valueA, $valueB) {
    if ($valueA['str'] > $valueb['str']) {
        return 1;
    } else if ($valueA['str'] < $valueb['str']) {
        return -1;
    }
    return 0;
}

usort($yourArray, "compare");

答案 2 :(得分:0)

usort()strnatcmp()是您的解决方案:

<?php
    function build_sorter($key) {
        return function ($a, $b) use ($key) {
            return strnatcmp($a[$key], $b[$key]);
        };
    }

    usort($array, build_sorter('def'));
    print_r($array);
?>

它将按您定义的键对所有数组进行排序。

答案 3 :(得分:0)

Array multisort要求您构建一个数组,其中包含您要排序的键的值,以执行您想要的操作,但使用原始数组的相同第一个维键。

因此,如果你创建一个包含0 =&gt;的数组10,1 =&gt; 5 ...等等,这些是键0和1的str或def的值,那么你可以做

foreach($originalArray as $key => $record) {
    $keyValuesArray[$key] = $record['str'];
}

array_multisort($keyvaluesArray, SORT_ASC, $originalArray);

原始数组将被修改为已排序。

至于你应该做什么,我不认为数组多重排序是“做到这一点的方式”,但这并不是一种糟糕的方式。其他解决方案可能会稍微提高效率。