1

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

这是我的来源:

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()这是上述代码的两个调用的输出:

来自 var_dump 输出的 screenshort

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

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

4

2 回答 2

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

于 2013-10-08T11:54:29.617 回答
4

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

于 2013-10-08T11:57:03.360 回答