2012-02-29 19 views
0

私は1D配列Aと2次元配列Bを持っています。別の配列に基づく2次元配列の並べ替え

arrayA[0] = 'D' 
arrayA[1] = 'U' 
arrayA[3] = 'R' 
arrayA[4] = 'B' 
arrayA[5] = 'S' 
arrayA[6] = 'H' 

arrayB[0][0] = 'D' arrayB[0][1] = 2 
arrayB[1][0] = 'B' arrayB[1][1] = 1 
arrayB[2][0] = 'R' arrayB[2][1] = 1 
arrayB[3][0] = 'U' arrayB[3][1] = 1 
arrayB[4][0] = 'H' arrayB[4][1] = 0 
arrayB[5][0] = 'S' arrayB[5][1] = 0 

arrayB [x] [y]はyに基づいてソートされます。

まず、arrayB [x] [y]からyを優先して文字を使って新しい配列を作成する必要があります。 しかし、yには同じ値があり、3回は1回、0回は2回あります。 この場合、同様の値はarrayAに従ってソートされます。

と新しい配列は次のようにソートされます:私は効率的にそれを行うことができますどのように

D, U, R, B, S, H 

?事前

+0

あなたが連想配列を使用していない任意の特定の理由は? 'arrayB ['D'] = 2'? –

+0

arrayAに目的のオフセット2を残しましたか? –

答えて

0

$string$weightarrayB[x][1]に対応し、$orderarrayAに対応し、arrayB[x][0]に対応:

<?php 

$string = str_split('DBRUHS'); 
$weight = str_split('211100'); 
$result = ''; 

function my_sort($a, $b) 
{ 
    $order = str_split('DURBSH'); 
    $a = array_search($a, $order); 
    $b = array_search($b, $order); 
    if ($a === $b) return 0; 
    if ($a === FALSE) return -1; 
    if ($b === FALSE) return 1; 
    if ($a == $b) return 0; 
    return ($a < $b) ? -1 : 1; 
} 

arsort($weight); 
$current_priority = -1; 
$substring = array(); 
$max = count($weight); 
$count = 1; 
foreach ($weight as $position => $priority) 
{ 
    if ($count++ == $max) 
    { 
     $substring[] .= $string[$position]; 
     $priority = $current_priority + 1; 
    } 
    if ($current_priority != $priority) 
    { 
     if (!empty($substring)) 
     { 
      usort($substring, 'my_sort'); 
      $result .= implode('', $substring); 
     } 
     $current_priority = $priority; 
     $substring = array($string[$position]); 
    } 
    else 
    { 
     $substring[] = $string[$position]; 
    } 
} 

print_r(str_split($result)); 

?> 
+0

上記のコードは、arrayA($ order)、arrayB($ stringおよび$ weight)のシーケンスでテストできます。それは実際に動作します。配列の内容にこれらの変数を代入するだけです。 (私は 'str_split'を単なる利便性として使用したので、配列全体を入力する必要はありませんでした。) –

0

おかげで私はこれを試してみましたが、それがうまく働きました。 a1は1次元配列、a2は2d配列です。

編集:これは今動作します。以下のコードで

function sortArr($a1, $a2) { 
    $t1 = array(); 

    foreach ($a1 as $v) { 
     $t2 = array(); 
     foreach ($a2 as $i=>$k) { 
      if ($k[0] == $v) { 
       $t2[0] = $k[0]; 
       $t2[1] = $k[1]; 
       $t1[$i] = $t2; 
       break; 
      } 
     } 
    } 

    return $t1; 
} 
+0

申し訳ありません、それは私のために働いていません – fean

+0

私は何か見落としました。ちょっと待って。 –

+0

私はそれを修正し、正常に動作するはずです。 –

関連する問題