使用指针

时间:2016-11-26 17:46:51

标签: php arrays multidimensional-array

我的网站上有非人类可读的网址,需要解析我所拥有的每个产品,类别和品牌的网址。这个任务让我得到了一个需要遍历多维数组并在其中进行更改的代码(添加节点)。

我有以下数组:

$a = array(
    'product' => array(
        'oven' => array(
            'url' => 'http',
            'category' => array(
                'single' => array(
                    'url' => 'http2'
                )
            )
        )
    )
);

我想通过它并在某些条件下进行一些更改,所以我需要保持指针。

我的代码现在是:

$data = array('product' => 'oven', 'category' => 'single');
$pointer = &$a;
foreach ($data as $field => $value) {
    func($field, $value, $pointer);
    print_r($a);
    print_r($pointer);
}



function func($field, $value, &$pointer) {
    if ( isset($pointer[$field][$value]) ) {
        echo 'exists';
        // moving into
        $pointer = &$pointer[$field][$value];
    } else {
        echo 'does not exist';
        $pointer[$field][$value] = array('url' => 'someUrl');
        // moving into
        $pointer = &$pointer[$field][$value];
    }
}

输出显示“进入”行不起作用。

exists
Array
(
    [product] => Array
        (
            [oven] => Array
                (
                    [url] => http
                    [category] => Array
                        (
                            [single] => Array
                                (
                                    [url] => http2
                                )

                        )

                )

        )

)
Array
(
    [product] => Array
        (
            [oven] => Array
                (
                    [url] => http
                    [category] => Array
                        (
                            [single] => Array
                                (
                                    [url] => http2
                                )

                        )

                )

        )

)
does not exist
Array
(
    [product] => Array
        (
            [oven] => Array
                (
                    [url] => http
                    [category] => Array
                        (
                            [single] => Array
                                (
                                    [url] => http2
                                )

                        )

                )

        )

    [category] => Array
        (
            [single] => Array
                (
                    [url] => someUrl
                )

        )

)
Array
(
    [product] => Array
        (
            [oven] => Array
                (
                    [url] => http
                    [category] => Array
                        (
                            [single] => Array
                                (
                                    [url] => http2
                                )

                        )

                )

        )

    [category] => Array
        (
            [single] => Array
                (
                    [url] => someUrl
                )

        )

)

2 个答案:

答案 0 :(得分:0)

进入'由于您需要使用Returning References,因此行不起作用。在这种情况下,您必须在两个地方使用& - 表示您希望通过引用返回,而不是副本,并指示应该为{{1}执行引用绑定,而不是通常的赋值}。这将有效:

$pointer

注意:请记住PHP中没有指针only references

答案 1 :(得分:0)

我建议使用递归,而不是使用foreach覆盖 $ data 。它将需要较少的此参考业务,这往往会使代码更难调试:

func($data, $a);

function func($data, &$a) { // the only place where you need a reference now
    if (!is_array($a) || !count($data)) return; // nothing more to do
    list($field, $value) = each($data); // get first data key/value
    if (!isset($a[$field][$value])) {
        echo 'does not exist';
        $a[$field][$value] = array('url' => 'someUrl');
    }
    // recursive call, without first element of $data, and going deeper in $a
    func(array_slice($data, 1), $a[$field][$value]);
}