我的网站上有非人类可读的网址,需要解析我所拥有的每个产品,类别和品牌的网址。这个任务让我得到了一个需要遍历多维数组并在其中进行更改的代码(添加节点)。
我有以下数组:
$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
)
)
)
答案 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]);
}