You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:32:47