5

我有一个数组:

$example = array();

$example ['one']   = array('first' => 'blue',
                           'second' => 'red');

$example ['two']   = array('third' => 'purple',
                           'fourth' => 'green');

$example ['three'] = array('fifth' => 'orange',
                           'sixth' => 'white');

根据函数的一些输入,我需要在 foreach 循环处理我的输出之前更改示例数组的顺序:

switch($type)

case 'a':
//arrange the example array as one, two three
break;

case 'b':
//arrange the example array as two, one, three
break;

case 'c':
//arrange the example array in some other arbitrary manner
break;

foreach($example as $value){
        echo $value;
}

有没有一种简单的方法可以在不重新设计我的所有代码的情况下做到这一点?我有一个非常深入的 foreach 循环来进行处理,如果有一种简单的方法可以简单地每次重新排序数组,那将非常有帮助。

4

4 回答 4

2

你不会在这里找到灵丹妙药的答案。您可能需要编写自己的函数以用于uksort().

uksort($example, function ($a, $b) use $type {
    switch($type) {
        case 'a':
            if ($a === 'one' || $b === 'three') return 1;
            if ($a === 'three' || $b === 'one') return -1;
            if ($a === 'two' && $b === 'three') return 1;
            return -1;
            break;
        // and so on...
    }
});
于 2013-02-26T21:24:02.493 回答
2

你可以使用array_multisort你的排列。我假设您知道排列并且不需要从键名派生它。说,你想要 order two, three, one,然后创建一个像这样的引用数组:

$permutation = array(3, 1, 2);

含义:第一项到位置 3,第二项到位置 1,第三项到位置 2

然后,在 , 之后switch排列:

array_multisort($permutation, $example);

这将对$permutation数组进行排序并将相同的顺序应用于$example.

于 2013-02-26T22:27:56.820 回答
0

您需要为每种情况编写自定义排序函数,然后使用usort。第一种情况可以只使用排序。任意排序需要是您定义的逻辑。

于 2013-02-26T21:19:22.967 回答
0

我看到了更多解决这个问题的方法,但不知道更多关于我不知道什么更好。

  1. 做一个预评分(为每个元素制作一个数值,在你的“相当深入的 foreach 循环”中计算),然后使用它作为主要和单一标准对数组进行排序。

  2. 如果您的条件仅基于数字字段,则 ASC/DESC 使用http://php.net/manual/en/function.array-multisort.php

  3. 为每种情况制作自定义排序功能(http://www.php.net/manual/en/function.usort.php

于 2013-02-26T21:42:58.800 回答