2013-02-26 149 views
5

我有一个数组:重新安排PHP关联数组

$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 2013-02-26 21:23:37

+0

我想问题的关键是我需要对它们进行排序,并且不会落入任何现成的排序标准,如字母或数字......我需要将它按照我如何分类进行排序。 – absentx 2013-02-26 21:55:24

回答

2

您可以使用array_multisort为您置换。我假设你知道这个排列,并且不需要从关键名字中派生出来。比方说,要顺序two, three, one,然后创建参考阵列那样:

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

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

然后,switch,置换后:

array_multisort($permutation, $example); 

这将排序$permutation阵列和应用相同的顺序$example

+0

因为我没有使用数字键将排列数组的工作?这似乎是我采取的路线,因为你是绝对正确的,因为我知道每种情况下我想要的排列组合。 – absentx 2013-02-26 23:20:05

+0

它与按键无关,array_multisort保留非数字键,所以:是的,它会工作 – 2013-02-26 23:21:52

+0

是的,这是做到这一点的方式,再次感谢。花了一点时间把我的头围绕在排列上(一段时间不必使用它们),但最终这是最简单的方法,因为我知道每个案例的顺序。 – absentx 2013-02-26 23:46:24

0

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

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... 
    } 
}); 
0

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

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

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

  3. 让自定义排序功能对每一种情况下(http://www.php.net/manual/en/function.usort.php