2010-04-24 59 views
5

一直困在這一個現在,所以任何幫助將不勝感激。我有一個包含元素列表的數組(左側),目標是使用左側數組中的值對另一個數組(右側)鍵進行排序。更改索引秩序排列

左陣列

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

右陣列

Array 
(
    [0] => Array 
    (
     [FirstName] => Pim 
     [Address] => Finland 
     [LastName] => Svensson 
     [ID] => 3 
    ) 
    [1] => Array 
    (
     [FirstName] => Emil 
     [Address] => Sweden 
     [LastName] => Malm 
     [ID] => 5 
    ) 
) 

我試圖完成將類似於此

Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ) 

有人嗎? :) 哦,我正在運行PHP 5.3,如果它有幫助!

回答

7
$output = array(); 
foreach ($right as $array) { 
    foreach ($left as $field) { 
     $temp[$field] = $array[$field]; 
    } 
    $output[] = $temp; 
} 
+0

+1簡單,清晰,有效。 – goat 2010-04-24 16:01:17

+0

很棒,它做到了! – 2010-04-25 21:16:02

2

你必須爆炸陣列 商店在這樣

$array = Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ); 

,然後一個變量數組爆炸陣列 爆炸數組,你會得到那麼陣列的參數分隔後可以使用內爆功能將它們按任意順序排列如你所願

+0

你有沒有得到結果 – udaya 2010-04-24 10:55:05

0

我會後退一步,看看你真正需要做什麼。該數組是關聯的,因此您可以立即訪問正確的元素,對嗎?因此,除非您使用foreach打印輸出,否則您並不需要這樣做。

我建議以下解決方案之一:

  1. 如果需要「正確的」數組是在關鍵的順序,再看看數據庫查詢/相似,在選擇列您需要他們的訂單。
  2. Foreach要打印的人,在「左」數組中查找該訂單的順序,然後在「右」數組中打印該鍵的相應值。
+0

我不從數據庫中選擇任何東西,我從一個XML加載了simplexml的數組! – 2010-04-24 18:52:11

0

那麼,你的問題是不常見的,通常關聯數組用於解決有關「位置」的任何問題。 無論如何,有很多方法可以做你正在尋找什麼,你在找什麼。

您可以使用列表(),但它是一個基於位置:

foreach($oldArray as $o) 
{ 
    list($firstName,$lastName,$address,$id)=$oldArray; 
    $newArray[]=array($id,$firstName,$lastName,$address); 
} 

但解決你的問題很直接以正確的順序,而不是重新排序填補後陣的最佳方式:)

+0

謝謝! 我其次,但我從另一個服務的XML獲取信息,這種方式我不能總是保證數據的順序。因此,這個奇怪的任務! :) – 2010-04-24 18:51:18

3

您可以使用uksort(),它允許您通過用戶定義的函數對數組鍵進行排序。例如:

function sort_by_array($array) { 
    // create a sorting function based on the order of the elements in the array 
    $sorter = function($a, $b) use ($array) { 
     // if key is not found in array that specifies the order, it is always smaller 
     if(!isset($array[$a])) return -1; 
     if($array[$a] > $array[$b]) { 
      return 1; 
     } 
     return ($array[$a] == $array[$b]) ? 0 : -1; 
    }; 
    return $sorter; 
} 
// $array contains the records to sort 
// $sort_array is the array that specifies the order 
foreach($array as &$record) { 
    uksort($record, sort_by_array(array_flip($sort_array))); 
} 

我利用5中的可能性。3,動態定義功能,我用array_flip()改造:

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

Array 
(
    [ID] => 0 
    [FirstName] => 1 
    [LastName] => 2 
    [Address] => 3 
) 

這使得它更容易鍵後進行比較。

+2

1+爲了靈活性,但我認爲這是特別複雜的情況。 – goat 2010-04-24 16:03:21

+0

@chris:是的,在這種情況下,取決於OP真正想要對陣列做什麼,它可能會變得複雜。但我想知道爲什麼沒有人提到這種方法,我想表明這是可能的。 – 2010-04-24 16:16:17