2011-10-18 73 views
6

我想排序由另一个数组的多维数组,但迄今为止已经短暂。
array_multisort似乎只适用于真正的排序。PHP的 - 由另一个阵列排序多维数组

假设我有这2个数组:

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

$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 

现在我想根据我的$order排列顺序进行排序我$data阵列。
这是我想的结果是:

$data = array(
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
    array('id' => 1, 'title' => 'whatever'), 
); 

我可以通过运行一个嵌套循环做到这一点很容易,但不会很好地扩展(我的数组是相当大的,而阵列有更多的领域)。

回答

4

在PHP中没有内置函数,我无法想到任何自定义函数,这将使用usort来做到这一点。但是array_map很简单,所以为什么不使用它呢?

$sorted = array_map(function($v) use ($data) { 
    return $data[$v - 1]; 
}, $order); 
+0

即时通讯不能够使用我当前版本的PHP匿名函数 - 这将如何工作,而不使用它们? –

+0

在这里打开了一个问题http://stackoverflow.com/questions/13589707/php-modify-code-to-avoid-anonymous-functions –

0

您可以尝试使用自定义排序usort()。这样你可以使用第一个数组来确定第二个数组的顺序。

+0

我曾看过usort,但不知道它是否/如何与多维数组一起工作。 – MegaHit

+0

这就是使它非常有用的原因。您可以定义一个可以访问整个项目的函数,无论它只是一个字符串还是一个多维数组。所以在比较函数中,您可以比较顺序数组中的每个值索引。所以像这样:return(array_search($ a ['id'],$ order)> array_search($ b ['id'],$ order))? -1:1; –

4

在你的例子中,$ data数组中的ids被连续编号并从1开始。下面给出的代码假设情况总是如此。如果情况并非如此,则代码不起作用。

$result = array(); 
$index = 0; 
foreach ($order as $position) { 
    $result[$index] = $data[$position - 1]; 
    $index++; 
} 

http://codepad.org/YC8w0yHh您可以看到它适用于您的示例数据。

编辑

如果上述假设不成立,下面的代码将得到相同的结果:

<?php 

$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 

$order = array(2,3,1); 
$order = array_flip($order); 

function cmp($a, $b) 
{ 
    global $order; 

    $posA = $order[$a['id']]; 
    $posB = $order[$b['id']]; 

    if ($posA == $posB) { 
     return 0; 
    } 
    return ($posA < $posB) ? -1 : 1; 
} 

usort($data, 'cmp'); 

var_dump($data); 

http://codepad.org/Q7EcTSfs的证明。

通过调用$ order数组上的array_flip(),它可以用于位置查找。这就像一个散列表查找,它在时间上是线性的,或者是O(n)。你不能做得更好。

+0

你最后的解决方案基本上是运行一个糖加嵌套循环。我认为这不会很好。 – MegaHit

+0

@MegaHit在我的答案中看到更新的代码,你不能做得比这更好。 –

0

这将是我将如何做。我会使用一个自定义的usort函数(arr_sort)和$ data数组。

<?php 
$order = array(2,3,1); 
$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 
function arr_sort($a,$b){ 
    global $order; 
    foreach ($order as $key => $value) { 
    if ($value==$a['id']) { 
     return 0; 
     break; 
    } 
    if ($value==$b['id']) { 
     return 1; 
     break; 
    } 
    } 
} 
usort($data,'arr_sort'); 
echo "<pre>"; 
print_r($data); 
echo "<pre>";