我有一个像:
这样的数组array (
'0' => 1,
'1' => 3,
'2' => 4
)
我想把它变成一个多维数组,如:
array (
'1' =>
array (
'3' => '4'
),
)
另一个单一阵列:
array (
'0' => 'a',
'1' => 'b',
'2' => 'c',
'3' => 'd'
)
到:
array (
'a' =>
array (
'b' =>
array (
'c' => 'd'
),
),
),
我怎样才能做到这一点?
注意:
该数组是动态的,并不总是包含3或4个元素。
答案 0 :(得分:0)
如果它总是有3个元素:
$temp = array (
'0' => 1,
'1' => 3,
'2' => 4
);
$result = array();
$result[$temp['0']] = array($temp['1'] => $temp['2']);
答案 1 :(得分:0)
虽然我认为有更好的策略,但可以将eval()用于此目的:
autocomplete="nope"
结果:
<?php
/* Example array */
$arr1 = array(
'0' => 'a',
'1' => 'b',
'2' => 'c',
'3' => 'd'
);
$array_string = '';
/* Build array string */
for($i = 0; $i < count($arr1); $i++){
if($i < (count($arr1) - 1)){
$array_string .= 'array ( \''. $arr1[$i] .'\' => ';
} else {
$array_string .= ' \''. $arr1[$i] .'\'';
}
}
/* Close array string */
for($y = 0; $y < count($arr1); $y++){
if($y < (count($arr1) - 2)){
$array_string .= ' ), ';
} else {
$array_string .= ' )';
break;
}
}
/* Evaluate array string as PHP code and put it in $result */
$result = eval("return $array_string;");
/* Print the result */
echo '<pre>';
print_r($result);
echo '</pre>';
?>
但正如我所说,记住这句话:
如果eval()是答案,你几乎肯定会问错误的问题。 - Rasmus Lerdorf,PHP的BDFL
问问自己为什么需要这个。是否有其他策略可用于您想要的内容?
答案 2 :(得分:0)
有多种方法可以实现这一目标:
首先,使用array_pop()来 pop (即存储和删除)数组中的最后一个值。然后从数组的末尾迭代,连续创建一个包含值的数组(通过array_values()):
function transformArray($input) {
$accumulator = array_pop($input);
$values = array_values($input);
for($i = count($input)-1; $i > -1; $i--) {
$accumulator = array($values[$i] => $accumulator);
}
return $accumulator;
}
中演示的内容
使用上一个示例中的代码,for循环可以使用foreach替换为array_reverse()循环。这样我们就不必担心何时开始和停止索引值,索引到数组等等。
function transformArray($input) {
$accumulator = array_pop($input);
$values = array_reverse(array_values($input));
foreach($values as $value) {
$accumulator = array($value => $accumulator);
}
return $accumulator;
}
在this playground example中看到它。
Array_reduce()可用于简化迭代。 array_reduce()的第一个参数是输入数组,第二个是回调函数,第三个是初始值。回调函数的参数是 accumulator 值(来自先前的迭代)和当前数组索引处的数组元素。初始值用作第一次迭代的累加器值,因此我们可以传递从数组末尾弹出的值。
function transformArray($input) {
$accumulator = array_pop($input);
$values = array_reverse(array_values($input));
return array_reduce($values, function($accumulator, $element) {
return array($element => $accumulator);
}, $accumulator);
}
在this playground example中看到它。
也许最简单的技术是使用递归函数,通过使用array_shift()从数组中取出第一个元素并返回一个以该元素为键的数组,该值是调用相同函数的返回值,除非只有一个项目,在这种情况下返回一个项目。
function transformArray($input) {
if (count($input) == 1) {
return $input[0];
}
return array(array_shift($input) => transformArray($input));
}
在this playground example中看到它。