2015-12-22 42 views
4

请,我需要帮助。 如何我的数组通过PHP如何在PHP中转换数组[nesting]

Array 
(
    [0] => Apple 
    [1] => Orange 
    [2] => Tomato 
) 

转换为该

Array 
(
    [Apple] => Array 
     (
      [Orange] => Array 
       (
        [Tomato] => Array() 
       ) 

     ) 

) 

而且我不知道在我的数组有多少元素。 谢谢大家。

+0

有趣的问题... – Ahsan

+0

谢谢大家。所有答案都是优越的。 – Nail

+2

什么样的作业可以帮助完成? ;-)。仍然有趣的问题,有趣的答案 – cypherabe

回答

5

输出

Array 
(
    [0] => Apple 
    [1] => Orange 
    [2] => Tomato 
    [3] => Banana 
    [4] => Papaya 
) 
Array 
(
    [Apple] => Array 
     (
      [Orange] => Array 
       (
        [Tomato] => Array 
         (
          [Banana] => Array 
           (
            [Papaya] => Array 
             (
             ) 

           ) 

         ) 

       ) 

     ) 

) 

代码

$fruits = [ 

    "Apple", 
    "Orange", 
    "Tomato", 
    "Banana", 
    "Papaya" 

]; 

// Result Array 

$result = [ 

    $fruits[count($fruits) - 1] => [] 

]; 

// Process 

for ($counter = count($fruits) - 2; $counter >= 0; $counter--) { 

    $temp = $result; 

    unset($result); 

    $result[$fruits[$counter]] = $temp; 

} 

// Display 

echo "<pre>".print_r($fruits, true)."</pre>"; 
echo "<pre>".print_r($result, true)."</pre>"; 
+0

这是个好的答案 – devpro

+1

Ahsan,这项工作只在PHP 7中进行? – Nail

5

试试这个:

$array = array('apple','orange','tomato'); 
$count = count($array) - 1; 
$tempArray = array(); 
for($i = $count; $i >= 0; $i--) 
{ 
    $tempArray = array($array[$i] => $tempArray); 
} 
+0

'我不知道我阵列中有多少元素。 '仔细阅读问题。 –

+0

@u_mulder:谢谢你是对的,回答更新。请检查 – devpro

+1

简短而准确! –

5

尝试用:

$target = array(); 
$value = array(); 
$path = array('apple', 'orange', 'tomato'); 

$rv = &$target; 
foreach($path as $pk) 
{ 
    $rv = &$rv[$pk]; 
} 
$rv = $value; 
unset($rv); 

print_r($target); 

输出:

Array 
(
    [apple] => Array 
     (
      [orange] => Array 
       (
        [tomato] => Array 
         (
         ) 

       ) 

     ) 

) 

更新1:释

这里我使用引用/变量别名来遍历键的动态堆栈。该引用使得可以使用堆栈而不是通常更精简的递归。此外,此代码可以防止覆盖$target阵列中的现有元素。 有关引用的详细看看Reference Explained

$target = array(); //target array where we will store required out put 
$value = array(); //last value i.e. blank array 
$path = array('apple', 'orange', 'tomato'); //current array 

$rv = &$target; //assign address of $target to $rv (reference variable) 

foreach($path as $pk) 
{ 
    $rv = &$rv[$pk]; // Unused reference [ex. $rv['apple'] then $rv['apple']['orange'] .. so on ] - actually assigned to $target by reference 

    print_r($target); 
    echo '-----------------<br />'; 
} 
$rv = $value; //here $rv have unused refernce of value tomato so finally assigned a blank array to key tomoto 
// 
unset($rv); // Array copy is now unaffected by above reference 

echo "final array<br />"; 
print_r($target); 

输出:

Array 
(
    [apple] => 
) 
----------------- 
Array 
(
    [apple] => Array 
     (
      [orange] => 
     ) 

) 
----------------- 
Array 
(
    [apple] => Array 
     (
      [orange] => Array 
       (
        [tomato] => 
       ) 

     ) 

) 
----------------- 
final array 
Array 
(
    [apple] => Array 
     (
      [orange] => Array 
       (
        [tomato] => Array 
         (
         ) 

       ) 

     ) 

) 

在交代的输出,你可以跟踪的$target值在foreach

+0

简洁的答案... – Ahsan

+1

请你能解释一下解决方案。 –

+0

@VedPandya肯定让我更新我的答案。我会在代码中添加注释,以便每个人都能理解代码流程 –

2

你也可以尝试这种方式与foreachksort

<?php 

$fruits = array(

    "Apple", 
    "Orange", 
    "Tomato", 
    "Banana", 
    "Papaya" 

); 
krsort($fruits); 
$tmp = array(); 
foreach($fruits as $fruit){ 
     $tmp = array($fruit => $tmp); 
} 
echo "<pre>".print_r($tmp, true)."</pre>"; 

?> 

[概念验证]

Array 
(
    [Apple] => Array 
     (
      [Orange] => Array 
       (
        [Tomato] => Array 
         (
          [Banana] => Array 
           (
            [Papaya] => Array 
             (
             ) 

           ) 

         ) 

       ) 

     ) 

) 
+1

谢谢,这个解决方案很棒。 – Nail

2

虽然环和array_pop

$fruits = [ 
    "Apple", 
    "Orange", 
    "Tomato", 
    "Banana", 
    "Papaya" 
]; 

$output = []; 
while ($fruit = array_pop($fruits)) 
{ 
    $output = [$fruit => $output]; 
} 
1
$result = array_reduce(array_reverse($fruits), function (array $acc, $fruit) { 
    return [$fruit => $acc]; 
}, []); 

您只需从里面开出,敷值转换为$key => $value阵列。