2013-04-08 137 views
0

我遇到了数组排序问题。通过其中一个元素重新排序数组元素

我阵列的结构是这样的:

array(4) { 
    [1]=> 
    array(5) { 
    ["type"]=> 
    string(4) "A" 
    ["index"]=> 
    int(1) 
    } 
    [2]=> 
    array(5) { 
    ["type"]=> 
    string(4) "B" 
    ["index"]=> 
    int(4) 
    } 
    [3]=> 
    array(5) { 
    ["type"]=> 
    string(4) "C" 
    ["index"]=> 
    int(2) 
    } 
    [4]=> 
    array(5) { 
    ["type"]=> 
    string(4) "D" 
    ["index"]=> 
    int(3) 
    } 
} 

正如你可以看到,每个子阵列内,有一个关键的“指数”,和值以正确的顺序1-2-3有没有-4但是它是1-4-2-3。

如何让其子阵列,以正确的顺序列出我可以排序这个数组?

P.S .:的acutal阵列大得多&比这更加复杂。

+2

此问题未显示任何研究工作。 **做你的作业很重要**。告诉我们你发现了什么,***为什么它不符合你的需求。这表明你已经花时间去尝试帮助你自己了,它使我们避免重申明显的答案,最重要的是它可以帮助你得到更具体和相关的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit 2013-04-08 15:47:20

+0

上面的链接有助于thx! – JuLy 2013-04-08 15:54:00

+0

对于FreshPrinceOfSO,U打字所花的时间已经够回答这个问题 – JuLy 2013-04-08 15:57:01

回答

3
usort(
    $myArray, 
    function ($a, $b) { 
     if ($a['index'] == $b['index']) { 
      return 0; 
     } 
     return ($a['index'] < $b['index']) ? -1 : 1; 
    } 
); 
+0

+1,我们会怎样是通过命名功能的首选解决方案,因为PHP的5.3,在许多情况下。然而,仍然有一些用例指定回调是有用的。 (+感谢您帮助我解决语法错误!) – hek2mgl 2013-04-08 16:03:24

0

一个简单快速的解决方案,用于重新索引数组。

$old ; // Your old array 
$new = array() ; 
foreach ($old as $child){ 
    $new[$child['index']] = $child ; 
} 
1

对此,您可以使用函数usort()。它接受一个未排序的数组和一个回调函数作为它的参数。在回调函数中,您可以定义如何比较元素。这里谈到一个例子:

function compare($a, $b) { 
    if($a['index'] === $b['index']) { 
     return 0; 
    } 
    return $a['index'] < $b['index'] ? -1 : 1; 
} 

usort($array, 'compare'); 

注:回调可以是匿名函数或常规函数的名称。我使用了@MarkBaker使用匿名函数的函数名称。所以你有两个例子。