Значения массива неожиданно меняются - PullRequest
0 голосов
/ 10 июня 2010

Я использую 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 ]

1 голос
/ 10 июня 2010

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

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

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

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

1 голос
/ 10 июня 2010

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

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

РЕДАКТИРОВАТЬ: Ваш последний элемент является ссылкой (вероятно, остаток foreach по ссылке).Исправьте код, который создает массив, чтобы он не оставлял ссылку в последнем элементе.

...