Я использую 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'"
}
Значение в моем массиве изменилось, и я не знаю почему?
Любые предложения?
Вероятно, $filters
является ссылкой, и он изменяется в вызове метода или сам pr
имеет состояние/побочные эффекты. Второй вариант можно устранить, удалив вызовы на pr
и заменив его на var_dump
.
Ваш фрагмент кода не содержит достаточной информации. Ваш лучший вариант здесь - отладчик.
EDIT: Ваш последний элемент является ссылкой (вероятно, остатком foreach по ссылке). Исправьте код, который строит массив, чтобы он не оставил ссылку в последнем элементе.
$myArr
чего используется функция $myArr
?
Похоже на ошибку с доступом к массиву PHP по ссылке.
Из-за особенностей внутренней работы PHP, если ссылка делается на один элемент массива, а затем копируется массив, будь то путем присвоения или когда он передается по значению в вызове функции, ссылка копируется как часть массива. Это означает, что изменения в любых таких элементах в любом массиве будут дублироваться в другом массиве (и в других ссылках), даже если массивы имеют разные области (например, один является аргументом внутри функции, а другой является глобальным)! Элементы, которые не имели ссылок во время копирования, а также ссылки, назначенные этим другим элементам после копии массива, будут вести себя нормально (т.е. Независимо от другого массива).
Это не будет исправлено в ближайшее время. Это глубокая проблема в реализации и фиксация, это вызовет проблемы со скоростью и множество других проблем. Это то, что может быть закодировано слишком, поэтому не должно вызывать серьезных проблем.
$filters
где-то, которая модифицируется в вызовеfind
, либо изменяется поведение функцииpr()
. Можете ли вы показать, откуда поступает$filters
, вплоть до источника? Что произойдет, если вы скопируете$filters
на другое имя переменной и выполните тот же тест?