php foreach通过引用传递意外更改

时间:2013-10-08 11:50:50

标签: php arrays reference foreach

我对一个非常奇怪的问题感到疯狂。

这是我的来源:

function load_search_value($meta_query_array) {

    var_dump($meta_query_array);

    foreach($meta_query_array as &$query) {
        // change compare operator to BETWEEN
        $query['compare'] = 'BETWEEN';
    }

    var_dump($meta_query_array);

    return $meta_query_array;
}

这是来自上述代码的var_dump()两次调用的输出:

screenshort from var_dump output

有人知道我错过了什么吗?

究竟是什么导致关系运算符在给定的源代码中从AND更改为BND?我是否以错误的方式使用引用运算符导致意外行为?

2 个答案:

答案 0 :(得分:4)

你应该改变

foreach($meta_query_array as &$query) {
    // change compare operator to BETWEEN
    $query['compare'] = 'BETWEEN';
}

foreach($meta_query_array as $k => &$query) {
    if(is_numeric($k)) {
      // change compare operator to BETWEEN
      $query['compare'] = 'BETWEEN';
    }
}

这是因为对于第一次迭代$k == 'relation'$query == 'AND',在这种情况下$query['compare']会转换为$query[0],结果就是您要更改字符串中的字母而不是数组中的值。

答案 1 :(得分:4)

foreach的第一次迭代返回引用第一个数组元素(relation)的$ query,其中将['compare']值设置为'BETWEEN'....因为'compare'元素不存在,但我们有一个可以通过字符处理的字符串,我们进入松散的输入规则,'比较'== 0,所以第0个字符变为'B'