Значения массива неожиданно меняются

0

Я использую cakephp 1.2, и у меня есть массив, который, похоже, имеет изменение значения, даже если эта переменная не обрабатывается. Ниже приведен код, который вызывает у меня проблемы.

ОБРАТИТЕ ВНИМАНИЕ - ОБНОВЛЕНИЕ Изменение имени переменной не влияет на результат.

function findCountByString($string, $myArr=array()) {

$main_conditions['or'] = array();
$main_conditions['or']['Article.title LIKE '] = '%'.$string.'%';
$main_conditions['or']['Article.html_content LIKE '] = '%'.$string.'%';
$conditions['and'][] = $main_conditions;
$filter_conditions['or'] = array();
if(count($myArr) > 0) {
    # UPDATE NUMBER 2
    # if I comment out the below line everything is fine, this makes no sense!!!
    $filter_conditions['or']['ArticleEntity.entity_id'] = $myArr;
    $conditions['and'][] = $filter_conditions;
}

echo "Start of findCountByString()";
var_dump($myArr);

$test  = $this->find('count', array(
    'conditions' => $conditions,
    'joins' => array('LEFT JOIN `articles_entities` AS ArticleEntity ON `ArticleEntity`.`article_id` = `Article`.`id`'),
    'group' => 'Article.id'
    ));

echo "End of findCountByString()";
var_dump($myArr);

return $test;

}

Я получаю следующий вывод:

Start of findCountByString()

array(4) {
  [0]=>
  string(36) "4bdb1d96-c680-4c2c-aae7-104c39d70629"
  [1]=>
  string(36) "4bdb1d6a-9e38-479d-9ad4-105c39d70629"
  [2]=>
  string(36) "4bdb1b55-35f0-4d22-ab38-104e39d70629"
  [3]=>
  &string(36) "4bdb25f4-34d4-46ea-bcb6-104f39d70629"
}

End of findCountByString()

array(4) {
  [0]=>
  string(36) "4bdb1d96-c680-4c2c-aae7-104c39d70629"
  [1]=>
  string(36) "4bdb1d6a-9e38-479d-9ad4-105c39d70629"
  [2]=>
  string(36) "4bdb1b55-35f0-4d22-ab38-104e39d70629"
  [3]=>
  &string(38) "'4bdb25f4-34d4-46ea-bcb6-104f39d70629'"
}

Значение в моем массиве изменилось, и я не знаю почему?

Любые предложения?

  • 2
    Либо есть ссылка на $filters где-то, которая модифицируется в вызове find , либо изменяется поведение функции pr() . Можете ли вы показать, откуда поступает $filters , вплоть до источника? Что произойдет, если вы скопируете $filters на другое имя переменной и выполните тот же тест?
  • 0
    Я добавил дополнительные заметки, изменение имени переменной не имеет значения
Показать ещё 1 комментарий
Теги:
arrays
find
cakephp-1.2

2 ответа

1
Лучший ответ

Вероятно, $filters является ссылкой, и он изменяется в вызове метода или сам pr имеет состояние/побочные эффекты. Второй вариант можно устранить, удалив вызовы на pr и заменив его на var_dump.

Ваш фрагмент кода не содержит достаточной информации. Ваш лучший вариант здесь - отладчик.

EDIT: Ваш последний элемент является ссылкой (вероятно, остатком foreach по ссылке). Исправьте код, который строит массив, чтобы он не оставил ссылку в последнем элементе.

  • 0
    Я добавил дополнительные заметки, изменение имени переменной не имеет значения, я также заменил pr () на print_r ();
  • 0
    @Lizard использует «var_dump», а не «print_r». В $myArr чего используется функция $myArr ?
Показать ещё 2 комментария
1

Похоже на ошибку с доступом к массиву PHP по ссылке.

Из-за особенностей внутренней работы PHP, если ссылка делается на один элемент массива, а затем копируется массив, будь то путем присвоения или когда он передается по значению в вызове функции, ссылка копируется как часть массива. Это означает, что изменения в любых таких элементах в любом массиве будут дублироваться в другом массиве (и в других ссылках), даже если массивы имеют разные области (например, один является аргументом внутри функции, а другой является глобальным)! Элементы, которые не имели ссылок во время копирования, а также ссылки, назначенные этим другим элементам после копии массива, будут вести себя нормально (т.е. Независимо от другого массива).

Это не будет исправлено в ближайшее время. Это глубокая проблема в реализации и фиксация, это вызовет проблемы со скоростью и множество других проблем. Это то, что может быть закодировано слишком, поэтому не должно вызывать серьезных проблем.

http://bugs.php.net/bug.php?id=8130.

  • 0
    Я бы назвал это «предполагаемым поведением», а не ошибкой. Если у массива есть ссылка, и я копирую ее, почему я могу ожидать, что ссылка перестанет быть единицей? Кажется произвольным, с недостатком, который в противном случае повлек бы за собой копирование элемента, а не просто увеличение его счетчика ссылок.
  • 0
    Ох, это ошибка и действительно глубокая. Я нашел по крайней мере 5 сообщений об ошибках на PHP.net, и все они были признаны таковыми. Просто исправление этого означало бы переписать большую часть ядра PHP и изменит слишком много всего вокруг для этой «стычки» (которой можно избежать довольно легко). Итог: не используйте ссылки на массивы. Если вы все еще думаете, что это не ошибка, внимательно прочитайте статью в первой ссылке моего ответа. После этого, если вы все еще думаете, что это "нормальное поведение", я рад за вас :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню