【问题标题】:PHP - How to dynamically input multi-dimensional arrays only knowing the keys?PHP - 如何只知道键动态输入多维数组?
【发布时间】:2021-03-29 13:30:53
【问题描述】:

我有一个包含键值对的多维数组。键的某些值是数组,而该数组中的某些值也是数组。它只有 3 个分支深(目前),但我试图递归循环遍历数组,保存分支的每一级的键,并在它到达一个也模仿原始结构的字符串时创建一个新数组大批。当它到达一个字符串时,每个值都应该有一个新的对象实例化。

下面的代码可以做到这一点,但只创建一个平面数组。

foreach ($data as $key => $value) {
if (!is_array($value)) {
    $a_objects[$key] = new Component([$key], $value);
} else {
    foreach ($value as $valueKey => $valueValue) {
        if (!is_array($valueValue)) {
            $a_objects[$key . "_" . $valueKey] = new Component([$key, $valueKey], $valueValue);
        } else {
            foreach ($valueValue as $k => $v) {
                $a_objects[$key . "_" . $valueKey . "_" . $k] = new Component([$key, $valueKey, $k], $v);
            }
        }
    }
}

这是我自己最好的尝试,但经过一些测试后它似乎没有保存到 b_objects 中,它似乎没有保存对象实例。

$b_objects = [];
function create_r($data, $id)
{
    foreach ($data as $key => $value) {
        if (is_array($value) == true) {

            array_push($id, $key);
            create_r($value, $id);
        } else {

            array_push($id, $key);

            $b_objects[$key] = new Component($id, $value);
            $id = [];
        }
    }
}

$id = [];
create_r($data, $id);

echo "this is b_objects";
echo "<pre>";
print_r($b_objects);
echo "</pre>";

我验证了 $id 数组包含正确的“键”。我觉得这个解决方案非常接近,但我不知道如何使用我的 $id 数组来模拟 $data 的结构。

我希望能够说 $b_objects[$level1key][$level2key][$level3key]...[$leveln-1key] = new Component...

谢谢!

【问题讨论】:

  • 你想达到什么目的?当您可以使用自动加载时初始化所有内容似乎很愚蠢,因为当您实际访问它时,使用 __get 和 __call

标签: php arrays class instance key-value


【解决方案1】:

我建议你通过 $b_objects 引用你的 create_r() 函数。否则,每个函数调用都会实例化一个新的$b_objects 变量,之后代码中的任何地方都不会使用该变量。

通过引用传递允许函数实际更改输入数组。注意函数声明中的&amp; 符号。

function create_r($data, $id, &$res)
{
    foreach ($data as $key => $value) {
        if (is_array($value) == true) {

            array_push($id, $key);
            create_r($value, $id, $res);
        } else {

            array_push($id, $key);

            $res[$key] = new Component($id, $value);
            $id = [];
        }
    }
}

$id = [];
$b_objects = [];
create_r($data, $id, $b_objects);

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2014-02-01
    • 2023-02-14
    • 1970-01-01
    • 2012-06-05
    • 2021-11-28
    相关资源
    最近更新 更多