具有多个叶节点的PHP展平数组
将具有多个叶节点的数组展平的最佳方法是什么,以便每个叶的完整路径都是一个不同的返回具有多个叶节点的PHP展平数组,php,multidimensional-array,Php,Multidimensional Array,将具有多个叶节点的数组展平的最佳方法是什么,以便每个叶的完整路径都是一个不同的返回 array("Object"=>array("Properties"=>array(1, 2))); 屈服 对象。属性。1 对象。属性。2 我可以展平到Object.Properties.1,但2不能用递归函数处理: function flattenArray($prefix, $array) { $result = array(); foreach ($array as $key
array("Object"=>array("Properties"=>array(1, 2)));
屈服
function flattenArray($prefix, $array)
{
$result = array();
foreach ($array as $key => $value)
{
if (is_array($value))
$result = array_merge($result, flattenArray($prefix . $key . '.', $value));
else
$result[$prefix . $key] = $value;
}
return $result;
}
我认为,在预测多个叶节点时,自顶向下将不起作用,因此需要某种类型的自底向上处理,或者需要一种为每个叶和进程复制阵列的方法(尽管这似乎效率很低)使用函数flatMapAssoc():
从以下位置使用函数flatMapAssoc():
输出:
array(2) {
["Object.Properties.0"]=>
int(1)
["Object.Properties.1"]=>
int(2)
}
输出:
array(2) {
["Object.Properties.0"]=>
int(1)
["Object.Properties.1"]=>
int(2)
}
我将使用包装器函数隐藏实现细节(prefix参数) 并添加了一个if分支来测试空数组。最后,对于简单的leaf,您应该使用
$value
变量,而不是$key
变量
$x = array("Object"=>array("Properties"=>array(1, 2), "test"=>array(), "post"));
function flatten ($array) {
return flattenArray('',$array);
}
function flattenArray($prefix, $array) {
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
if(count($value)) {
$result = array_merge($result, flattenArray($prefix."$key.", $value));
} else {
$result[] = "$prefix$key";
}
} else {
$result[] = "$prefix$value";
}
}
return $result;
}
echo join("\n", flatten($x));
如果您想模拟树状结构,也许可以使用不同的数组结构。大概是这样的:
$y = array ("Object",
array("Properties", 1, 2),
"test",
"post"
);
然后,数组变为:
function flattenArray($prefix, $array) {
$result = array();
$prefix .=array_shift($array).'.';
foreach ($array as $value) {
if (is_array($value)) {
$result = array_merge($result, flattenArray($prefix, $value));
} else {
$result[] = "$prefix$value";
}
}
return $result;
}
我将使用包装器函数隐藏实现细节(prefix参数) 并添加了一个if分支来测试空数组。最后,对于简单的leaf,您应该使用
$value
变量,而不是$key
变量
$x = array("Object"=>array("Properties"=>array(1, 2), "test"=>array(), "post"));
function flatten ($array) {
return flattenArray('',$array);
}
function flattenArray($prefix, $array) {
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
if(count($value)) {
$result = array_merge($result, flattenArray($prefix."$key.", $value));
} else {
$result[] = "$prefix$key";
}
} else {
$result[] = "$prefix$value";
}
}
return $result;
}
echo join("\n", flatten($x));
如果您想模拟树状结构,也许可以使用不同的数组结构。大概是这样的:
$y = array ("Object",
array("Properties", 1, 2),
"test",
"post"
);
然后,数组变为:
function flattenArray($prefix, $array) {
$result = array();
$prefix .=array_shift($array).'.';
foreach ($array as $value) {
if (is_array($value)) {
$result = array_merge($result, flattenArray($prefix, $value));
} else {
$result[] = "$prefix$value";
}
}
return $result;
}
只是想知道,在这种情况下,如果您打印Object.Properties.1-您希望返回null,对吗?因为1,2不是键,但valuesIt在我运行代码时似乎对我来说基本正常。我在示例数组中得到的输出是数组(2){[“ObjectObject.Properties.0”]=>int(1)[“ObjectObject.Properties.1”]=>int(2)}。唯一的区别是数组(1,2)的索引分别是0和1。只是想知道,在这种情况下,如果打印Object.Properties.1-u,是否希望返回null?因为1,2不是键,但valuesIt在我运行代码时似乎对我来说基本正常。我在您的示例数组中得到的输出是数组(2){[“ObjectObject.Properties.0”]=>int(1)[“ObjectObject.Properties.1”]=>int(2)}唯一的区别是数组(1,2)的索引分别为0和1。工作起来像个符咒:)!工作起来像个符咒:)!