重新排列PHP关联数组

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循环来处理数据,如果有一种简单的方法可以每次仅仅重新排序数组,那将非常有帮助。


2
你的“任意数组排序”的目的是什么?你只是想随机排序吗?还是你特别想以参数化的方式移动项目? - user1477388
我想重点是我需要按照自己的方式对它们进行排序,这不属于任何现成的排序标准,比如字母或数字顺序...我需要按照我指定的方式精确地进行排序。 - absentx
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...
    }
});

2
你可以使用 array_multisort 来进行排列。我假设你已经知道了排列方式,不需要从键名中推导出来。比如说,你想要的顺序是 two, three, one,那么创建一个引用数组,就像这样:
$permutation = array(3, 1, 2);

意思:第一个项目移到位置3,第二个项目移到位置1,第三个项目移到位置2

然后,在switch之后,进行排列:

array_multisort($permutation, $example);

这将对$permutation数组进行排序,并将相同的顺序应用到$example中。

由于我没有使用数字键,排列数组会起作用吗?这似乎是我要采取的路线,因为您绝对正确,我确实知道每种情况下我想要的排列。 - absentx
这与键值无关,array_multisort保留非数字键,所以:是的,它会工作。 - Fabian Schmengler
是的,这就是做法,再次感谢。花了一点时间来理解排列组合(我已经有一段时间没有使用它们了),但最终这是最简单的方法,因为我知道每种情况的顺序。 - absentx

0

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


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接