2012-02-23 16 views
2

に連想配列のインデックスを移動するための最良の方法は何本をループし、それぞれの値をエコーするとき、我々は次の配列別の場所

$myArray = array( 
       "foo" => "value1" , 
       "bar" => "value2" , 
       "baz" => "value3" , 
       "qux" => "value4" 
    ); 

を持って言うことができますその常に最初のfooを印刷しよう、バー2番、バズ3番、クォックス4番です。 fooの後にquxの値を表示したいとします。これを行う最善の方法は何ですか。私はすべての異なったusort、uasort、uksortを試していて、私が望むものを得ていなかった。

スプライスを使用してトップにインデックスを移動するための良いコードがたくさんありましたが、私は連想配列のこの他のインデックスよりも前にこのインデックスを移動させることはできませんそのループをループするときに、他のインデックスの前に必要なインデックスにヒットします。

答えて

1

ない非常にエレガントな、それは動作します:

$arr = array( 
    "foo" => "value1" , 
    "bar" => "value2" , 
    "baz" => "value3" , 
    "qux" => "value4" 
); 

$tmp = array(); 
foreach($arr as $k=>$v) { 
    $tmp[] = array($k=>$v);; 
} 

array_splice($tmp, 1, 0, array_slice($tmp, 3)); 
array_splice($tmp, -1); 
$arr = array(); 
foreach($tmp as $k => $v) { 
    foreach($v as $k2 => $v2) { 
     $arr[$k2] = $v2; 
    } 
} 

print_r($arr); 

出力:

Array 
(
    [foo] => value1 
    [qux] => value4 
    [bar] => value2 
    [baz] => value3 
) 
+0

うん、うまくいった、ありがとう。おそらく一般的な状況であると私は見ているもののための非常に複雑な解決策のように見える、ここではこれをボックスの外で行う方法でなければならない。 –

-2

多分このようなものを使用できますか?あなたは配列内のparamのインデックスを検索し、スプライスを使用することができます。downvotedするに値するものすべてphp- $

function swap(arr, idxFrom, idxTo) 
{ 
    var tmp = arr[idxFrom]; 
    arr[idxFrom] = arr[idxTo]; 
    arr[idxTo] = tmp; 
} 

申し訳ありません、なし

+0

これに伴う問題は、私は、キーが値に一致し、ちょうど両方のキーの値を交換する必要がないです。私はそれがどのように滞在するためにバーが必要ですが、ちょうどquxの後に来る。 –

2

このような何か?

function custom_compare($a, $b) { 

    $target = array('foo', 'qux', 'bar', 'baz'); 

    return array_search($b, $target) - array_search($a, $target); 
} 

$myArray = array( 
    "foo" => "value1", 
    "bar" => "value2", 
    "baz" => "value3", 
    "qux" => "value4" 
); 

uksort($myArray, 'custom_compare'); 
+0

そのような作品ですが、私はuksortを使用しようとしていたときと同じ問題を抱えています。それはすべてのキーの周りを移動するので、それらはすべて異なる順番になりますが、私が動かしたいインデックスは、私が望むインデックスの前になります。 –

関連する問題