PHP-递归地替换数组键,并将值更改为包含旧键的数组
我花了一段时间试图从旧的答案中得到我需要的东西,但还没有完全得到(尽管已经接近了!) 我有这个PHP-递归地替换数组键,并将值更改为包含旧键的数组,php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,我花了一段时间试图从旧的答案中得到我需要的东西,但还没有完全得到(尽管已经接近了!) 我有这个 [January] => Array ( [Tuesday] => Array ( [foo] => Array ( [82] => 47731 [125] =&g
[January] => Array
(
[Tuesday] => Array
(
[foo] => Array
(
[82] => 47731
[125] => 19894
)
[bar] => Array
(
[82] => 29911
[125] => 10686
)
)
}
…我想要这个
[0] => Array
(
'key' => 'January'
'children' => Array
[0] => Array
{
'key' => 'Tuesday'
'children' => Array
[0] => Array
{
'key' => 'foo'
'values' => Array
{
[82] => 47731
[125] => 19894
}
[1] => Array
{
'key' => 'bar'
'values' => Array
{
[82] => 29911
[125] => 10686
}
}
)
}
通过调整来自的第一个答案,我得到了非常接近的结果,但只有结果的最底层是正确的——带有“星期二”、“foo”和“bar”键的节点看起来与源数组中的节点相同
这是我到目前为止得到的
public function transform_hierarchical_output(&$var)
{
if (is_array($var))
{
$final = [];
$i = 0;
foreach ($var as $k => &$v)
{
$new_node = [
'key' => $k,
'children' => $v
];
$k = $i;
$this->transform_hierarchical_output($v);
$final[$k] = $new_node;
$i++;
}
$var = $final;
}
elseif (is_string($var))
{
}
}
这需要使用任意长度和深度的源数组
提前谢谢
杰夫试试下面的方法:
function t($arr)
{
$a = [];
$num = 0;
foreach($arr as $k => $v) {
if (is_array($v))
{
$a[$num] = [
'key' => $k,
];
$a[$num][is_array(array_values($v)[0]) ? 'children' : 'values'] = t($v);
$num ++;
} else {
$a[$k] = $v;
}
}
return $a;
}
我应该注意的第一件事是,尽管在您的示例中有许多递归,但从技术上讲,就需要一个自执行函数而言,它不是一个递归循环。因为循环的方案在深度上有点波动,所以它在最后一个节点并没有遵循规则模式;不过,这是一个逻辑方案,但不会一直重复到最后一个节点
以下功能可能适用于您:
function doArray($array)
{
$keys = array_keys($array);
$arr_count = count($keys);
$new_array;
for($i = 0; $i < $arr_count; $i++)
{
$new_array[$i]["key"] = $keys[$i];
$new_keys = array_keys($array[$keys[$i]]);
for($w = 0; $w < count($new_keys); $w++)
{
$new_array[$i]["children"][$w]["keys"] = $new_keys[$i];
$new_array[$i]["children"][$w]["children"] = array();
for($w = 0; $w < count($new_keys); $w++)
{
$new_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]]);
for($q = 0; $q < count($new_new_keys); $q++)
{
$new_array[$i]["children"][$w]["children"][$q]["key"] = $new_new_keys[$q];
//$new_array[$i]["children"][$w]["children"][$q]["children"] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]];
$last_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]]);
for($s = 0; $s < count($last_new_keys); $s++)
{
$new_array[$i]["children"][$w]["children"][$q]["values"][$last_new_keys[$s]] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]][$last_new_keys[$s]];
}
}
}
}
}
return $new_array;
}
函数doArray($array)
{
$keys=数组\ U键($array);
$arr_count=计数($keys);
$new_阵列;
对于($i=0;$i<$arr\u count;$i++)
{
$new_数组[$i][“key”]=$keys[$i];
$new_keys=数组_keys($array[$keys[$i]]);
对于($w=0;$w
为什么值
用于foo
和bar
的子项,而子项
用于其他子项?这里有什么逻辑吗?最终每个节点都需要一组值,但我想我现在就不需要了!这很有效。如果我能选择多个答案,我会的!只勾选了另一个,因为它是第一个。谢谢你的输入。Ace。谢谢你抽出时间。
function doArray($array)
{
$keys = array_keys($array);
$arr_count = count($keys);
$new_array;
for($i = 0; $i < $arr_count; $i++)
{
$new_array[$i]["key"] = $keys[$i];
$new_keys = array_keys($array[$keys[$i]]);
for($w = 0; $w < count($new_keys); $w++)
{
$new_array[$i]["children"][$w]["keys"] = $new_keys[$i];
$new_array[$i]["children"][$w]["children"] = array();
for($w = 0; $w < count($new_keys); $w++)
{
$new_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]]);
for($q = 0; $q < count($new_new_keys); $q++)
{
$new_array[$i]["children"][$w]["children"][$q]["key"] = $new_new_keys[$q];
//$new_array[$i]["children"][$w]["children"][$q]["children"] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]];
$last_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]]);
for($s = 0; $s < count($last_new_keys); $s++)
{
$new_array[$i]["children"][$w]["children"][$q]["values"][$last_new_keys[$s]] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]][$last_new_keys[$s]];
}
}
}
}
}
return $new_array;
}