0

可能重复:
如何在 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 
                   ) 
    )

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

我知道我应该为此使用 array_multi_sort。

谢谢。

4

4 回答 4

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");

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

于 2012-09-08T20:49:06.307 回答
0

使用排序功能。在您的情况下将是这样的:

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

usort($yourArray, "compare");
于 2012-09-08T20:53:26.560 回答
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);
?>

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

于 2012-09-08T20:53:36.257 回答
0

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

因此,如果您创建一个包含 0 => 10、1 => 5... 等的数组,其中这些是键 0 和 1 的 str 或 def 的值,那么您可以这样做

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

array_multisort($keyvaluesArray, SORT_ASC, $originalArray);

并且原始数组将被修改以进行排序。

至于你应该做什么,我不认为数组多排序是这样做的“方式”,但也不是一种糟糕的方式。其他解决方案可能会更有效。

于 2012-09-08T20:57:36.680 回答