PHP函数内array_push失效:用array_walk_recursive提取数组值遇阻
问题
使用array_walk_recursive从多维测试数组中提取所有名为second_key的键对应的值,并存入另一个结果数组。已完成以下操作:
- 创建包含两个
second_key的多维测试数组 - 创建结果数组并添加测试条目
- 尝试提取值存入结果数组,但发现函数内的
array_push等添加操作均失效,推测是缺少引用导致,请问该如何修复?
原代码:
$test_array = array(); $test_array['NUMERO_ONE'] = array( "initial_key" => "Alpha", "details" => array( "first_key" => ".Alpha_1", "second_key" => "Alpha_2" ) ); $test_array['NUMERO_TWO'] = array( "initial_key" => "Beta", "details" => array( "first_key" => ".Beta_1", "second_key" => "Beta_2" ) ); var_dump($test_array); echo "<br>***********************************<br>"; $results_array = array(); $results_array[] = "banana"; array_push($results_array, "tomato"); var_dump($results_array); echo "<br>***********************************<br>"; function my_function($value, $key, &$results_array) { echo "Content of $key is: $value <br>"; if ($key == "second_key") { echo "SECOND KEY: " . $value . "<br>"; $results_array[] = $value; $results_array[] = "test_A"; array_push( $results_array, $value); } } array_walk_recursive($test_array,"my_function", $results_array); echo "<br>***********************************<br>"; var_dump($results_array);
修复方案
问题核心是**array_walk_recursive默认以值传递的方式传递第三个参数**,即便你在回调函数的参数里加了&,回调内修改的也只是数组副本,不会影响外部的原结果数组。
只需修改array_walk_recursive的调用语句,给$results_array加上引用符号&即可:
array_walk_recursive($test_array,"my_function", &$results_array);
修正后的完整代码
$test_array = array(); $test_array['NUMERO_ONE'] = array( "initial_key" => "Alpha", "details" => array( "first_key" => ".Alpha_1", "second_key" => "Alpha_2" ) ); $test_array['NUMERO_TWO'] = array( "initial_key" => "Beta", "details" => array( "first_key" => ".Beta_1", "second_key" => "Beta_2" ) ); var_dump($test_array); echo "<br>***********************************<br>"; $results_array = array(); $results_array[] = "banana"; array_push($results_array, "tomato"); var_dump($results_array); echo "<br>***********************************<br>"; function my_function($value, $key, &$results_array) { echo "Content of $key is: $value <br>"; if ($key == "second_key") { echo "SECOND KEY: " . $value . "<br>"; $results_array[] = $value; $results_array[] = "test_A"; array_push( $results_array, $value); } } // 传递结果数组的引用 array_walk_recursive($test_array,"my_function", &$results_array); echo "<br>***********************************<br>"; var_dump($results_array);
运行后,$results_array会包含初始的banana、tomato,以及提取到的Alpha_2、test_A、Alpha_2、Beta_2、test_A、Beta_2,符合预期。
内容的提问来源于stack exchange,提问作者jochen thomas
相关产品推荐
相关产品推荐

