2012-02-23 33 views
2

最好的辦法可以說我們有以下陣列什麼是關聯數組索引移動到不同的位置

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

當通過這個循環和呼應的每一個值的總是會先打印FOO ,第二棒,第三棒,第四棒。假設我想在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

是的工作,非常感謝。好像什麼我看到一個非常複雜的解決方案可能是一個常見的情況,這裏應該是這樣做出來的箱子的方法。 – 2012-02-23 16:15:33

-2

也許你可以使用這樣的事情?

沒有所有的PHP的$

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

抱歉,這當之無愧地被downvoted:你能找到的陣列在參數的索引,然後使用拼接。

+0

這個問題是我需要鍵匹配的值,而不是隻交換兩個鍵的值。我需要酒吧保持它的方式,但只是在qux之後。 – 2012-02-23 15:41:13

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時遇到的相同的問題。它圍繞着所有的鍵移動,以便它們的順序不同,但是我想要移動的索引現在位於我想要的索引之前。 – 2012-02-23 16:28:23