2012-01-24 45 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