2012-01-24 43 views
0

我想对从XML源发送的数组进行排序。排序多维数组中的子数组值

的阵列看起来像这样从print_r的($答案);:

Array 
(
[size] => Array 
    (
     [0] => 1.5m x 1.5m 
     [1] => 1.5m x 3m 
     [2] => 3m x 6.0m 
     [3] => 3m x 2.3m 
    ) 

[rate] => Array 
    (
     [0] => 80 
     [1] => 135 
     [2] => 295 
     [3] => 180 
    ) 

[sortorder] => Array 
    (
     [0] => 3 
     [1] => 4 
     [2] => 1 
     [3] => 2 
    ) 
. 
. 
. 
) 

我想离开数组:

Array 
(
[size] => Array 
    (
     [0] => 3m x 6.0 
     [1] => 3m x 2.3m 
     [2] => 1.5m x 1.5m 
     [3] => 1.5m x 3m 
    ) 

[rate] => Array 
    (
     [0] => 295 
     [1] => 180 
     [2] => 80 
     [3] => 135 
    ) 

[sortorder] => Array 
    (
     [0] => 1 
     [1] => 2 
     [2] => 3 
     [3] => 4 
    ) 
. 
. 
. 
) 

我所要做的是使用排序子阵列按顺序显示项目

我已经尝试了一些uasort()和array_multisort()示例,但似乎都是为了排列子数组而不是子数组内的值

任何想法将是一个很大的帮助。欢呼声

+0

我建议先排序您的'sortorder'数组,然后使用这些键在单个循环中重新填充其他数组。或重新组织你的数组结构,所以它更有意义(大小和速率和顺序是关闭每个项目的同一分支) – Scuzzy

回答

0

这一个排序$answer['sortorder'],并使用这些密钥不先重组的$answer其余部分进行排序。

// sort $answer['sortorder'] and retrieve indices. 
asort($answer['sortorder']); 
$idx = array_keys($answer['sortorder']); 

// do sorting 
$sorted = array(); 
foreach($answer as $key=>$subarr) { 
    if ($key != 'sortorder') { // don't sort 
    foreach($idx as $i) { 
     $sorted[$key][] = $subarr[$i]; 
    } 
    } else { 
     // $answer['sortorder'] is already sorted. 
     $sorted[$key] = $subarr; 
    } 
} 
print_r($sorted); 

看到它在行动here

+0

优秀的,你可以将数组再次“拆散”为原始格式, 谢谢。非常优雅的解决方案,因为它需要阵列。谢谢堆:) – Deepweb

0

该方法将重新构造排序顺序为索引的数组,然后对数组进行排序,然后将其返回给它的原始结构。

echo '<pre>'; 

$array['size'][0] = '1.5m x 1.5m'; 
$array['size'][1] = '1.5m x 3m'; 
$array['size'][2] = '3m x 6.0m'; 
$array['size'][3] = '3m x 2.3m'; 

$array['rate'][0] = 80; 
$array['rate'][1] = 135; 
$array['rate'][2] = 295; 
$array['rate'][3] = 180; 

$array['sortorder'][0] = 3; 
$array['sortorder'][1] = 4; 
$array['sortorder'][2] = 1; 
$array['sortorder'][3] = 2; 

$temp = array(); 
foreach($array['sortorder'] as $key => $value) 
{ 
    $temp[$array['sortorder'][$key]] = array(
    'size'=>$array['size'][$key], 
    'rate'=>$array['rate'][$key], 
    'sortorder'=>$array['sortorder'][$key] 
); 
} 
ksort($temp); 
$array = array(); 
foreach($temp as $key => $value) 
{ 
    $array['size'][] = $value['size']; 
    $array['rate'][] = $value['rate']; 
    $array['sortorder'][] = $value['sortorder']; 
} 

print_r($array); 
+0

我需要在尝试排序之前以这种方式提取数组和格式。我希望直接从数组结构中读取 – Deepweb

+0

呵呵,我的代码可以和你的数组结构一起工作吗? – Scuzzy

0

我可以建议使用捆绑的每个大小,速度不同的阵列结构和排序顺序到一个项目:

array(
    array('size' => '...', 'rate' => '...', 'sort order' => '...'), 
    ... 
) 

这使得它微不足道的排序,实际上更容易使用一般来说。
这个PHP 5.3+代码做这种转变和排序:

$answer = array_map(function ($size, $rate, $sortorder) { 
       return compact('size', 'rate', 'sortorder'); 
      }, $answer); 
usort($answer, function ($a, $b) { return $a['sortorder'] - $b['sortorder']; }); 
+0

不幸的是,我无法控制数组结构。我希望能像你所说的那样使用usort,但是我看到的例子中没有一个处理这种数据 – Deepweb

+0

好吧,如果你真的需要... – deceze