具有多个叶节点的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)));
屈服

  • 对象。属性。1
  • 对象。属性。2
  • 我可以展平到Object.Properties.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。工作起来像个符咒:)!工作起来像个符咒:)!