2012-01-24 5 views
0

XML 피드에서 보낸 배열을 정렬하려고합니다.MultiDimension Array에서 하위 배열 값 정렬

배열 인 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의 나머지 부분을 정렬하는 키를 사용
이 PHP 5.3+ 코드는이 변환 및 정렬을 수행합니다.

// 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

Excellent , 감사. 매우 우아한 솔루션으로 어레이를 그대로 사용합니다. 감사합니다 힙을 :) – 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' => '...'), 
    ... 
) 

정렬 할 사소한하게, 쉽게, 사실은 함께 작동하도록 일반적으로

$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