2013-10-08 3 views
1

Я схожу с ума по действительно странной проблеме.php 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 в данном исходном коде? Я использую ссылочный оператор неправильным образом, вызывая неожиданное поведение?

+1

Почему вы используете ссылки .. ?? & $ query'.? –

+0

У вас есть какая-либо ценность под названием «BND» где угодно? –

ответ

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] и результат в том, что вы меняете письмо в строке вместо значения в массиве.

+0

wow, +1 для улова –

+0

Спасибо. Я полностью забыл, что вы можете получить доступ к строке, используя синтаксис массива. ... иногда вы просто не видите очевидного. :-) – s1lv3r

+0

@ s1lv3r Рад, что я помог =) не стесняйтесь принять ответ, который он вам помог! –

4

Первая итерация foreach возвращает $ query, ссылающийся на первый элемент массива (relation), где вы устанавливаете значение ['compare'] в значение «BETWEEN» ... Поскольку элемент «compare» не существует, но у нас есть строка которые могут быть решены с помощью символа, мы получаем в правила свободной печати, 'compare' == 0, поэтому 0-й символ заменен на 'B'

+0

Да, вот и все, как я заметил. –

Смежные вопросы