【问题标题】:php foreach pass by reference unexpected changesphp foreach 通过引用传递意外更改
【发布时间】:2013-10-08 11:50:49
【问题描述】:

我正在为一个非常奇怪的问题而疯狂。

这是我的来源:

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() 的两次调用的输出:

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

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

【问题讨论】:

  • 为什么要使用引用..??&$query.?
  • 你有任何名为“BND”的值吗?

标签: php arrays reference foreach


【解决方案1】:

你应该改变

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],结果是您正在更改字符串中的字母而不是数组中的值。

【讨论】:

  • 谢谢。我完全忘记了您也可以使用数组语法访问字符串。 ...有时你只是看不到明显的东西。 :-)
  • @s1lv3r 很高兴我得到了帮助 =) 随时接受它对您有帮助的答案!
【解决方案2】:

foreach 的第一次迭代返回 $query 引用第一个数组元素 (relation),您在其中将 ['compare'] 值设置为 'BETWEEN'...。因为 'compare' 元素不存在,但我们有一个可以按字符寻址的字符串,我们进入松散的打字规则,'compare' == 0,所以第 0 个字符更改为 'B'

【讨论】:

  • 是的,就是这样,我也注意到了。
猜你喜欢
  • 2011-03-19
  • 2014-12-23
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多