2014-04-28 53 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 ...完成。这应该做到这一点。 –