2014-04-28 52 views
0

所以我有這個數組:移動多維數組項

$input = array (
    1 => array (
     'TitleName' => 'Details', 
     'TitleID' => 1, 
     1 => array (
      'ID' => 1, 
      'Name' => 'First Name' 
     ), 
     2 => array (
      'ID' => 2, 
      'Name' => 'Last Name' 
     ), 
     3 => array (
      'ID' => 4, 
      'Name' => 'City') 
     ), 
    12 => array (
     'TitleName' => 'System', 
     'TitleID' => 12, 
     0 => array (
      'ID' => 3, 
      'Name' => 'Cpu' 
     ) 
    ) 
); 

,我已經告訴我如何訂購上述數組的數組:

$order = array 
(
    1 => array(
     0 => 1, // this is the ID in the third dimension 
     1 => 4, 
     2 => 2, 
    ), 
    12 => array (
     0 => 3 
    ) 
); 

因此,問題是,我會得到在我的最後陣列:

Array 
(
    [1] => Array 
     (
      [TitleName] => Details 
      [TitleID] => 1 
      [1] => Array 
       (
        [ID] => 1 
        [Name] => First Name 
       ) 
      [2] => Array 
       (
        [ID] => 4 
        [Name] => City 
       ) 
      [3] => Array 
       (
        [ID] => 2 
        [Name] => Last Name 
       ) 
     ) 

    [12] => Array 
     (
      [TitleName] => System 
      [TitleID] => 12 
      [0] => Array 
       (
        [ID] => 3 
        [Name] => Cpu 
       ) 
     ) 
) 

另外,我怎麼能將數組內的項目移動到不同的父?

我試過這段代碼,但沒有運氣。

usort($array, function ($a, $b) use ($order) { 
    $pos_a = array_search($a['id'], $order); 
    $pos_b = array_search($b['id'], $order); 
    return $pos_a - $pos_b; 
}); 

任何想法??謝謝!

+0

是否唯一? –

+0

@AndreschSerj是 – Bonik

回答

1

由於您的ID是唯一的,因此只需填充兩個臨時數組,然後迭代排序數組以創建所需的輸出可能會更容易。

Here's a possible solution。這裏不需要array_search。

有了你的兩個goven數組,我們首先迭代輸入,分離出共同的第一級元素,它的屬性和子元素。

要is_array第一級別的元素,我們使用is_numeric的關鍵chiuldren屬性區分(因爲屬性鍵不是數字)和(只是爲了確保)。我們現在有兩個數組。一($tmpElements)擁有所有的第一級別的元素(詳細,系統),另一個($tmpChildren)擁有所有的子元素(First Name, Last Name, Cpu, City)。對於這兩個數組,我們將它們的id作爲數組鍵。

現在我們遍歷排序數組,將我們的子元素填充到我們的$tmpElements數組中的各個第一級元素中,取決於$order

foreach($order as $key => $values) { 
    foreach($values as $orderId) { 
     $tmpElements[$key][] = $tmpChildren[$orderId]; 
    } 
} 

在這裏,從$key第一陣列是用於我們的第一級元件陣列關鍵,這既是爲了作爲在源/輸入並且如在我們的$tmpElements。所以我們可以用它來識別我們陣列中的元素。

第二個foreach中的$orderId是第二級子元素ID。因此,我們用它來達到我們各自的兒童元素。 因此:$tmpElements[$key][] = $tmpChildren[$orderId];

+0

工程就像一個魔術。謝謝。你能解釋一些關於代碼的內容嗎? – Bonik

+1

@Bonik:好的。我會給它一個編輯。 –

+1

@Bonik ...完成。這應該做到這一點。 –