我正在使用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'"
}
我的数组中的值已经改变了,我不知道为什么?
有什么建议吗?
答案 0 :(得分:1)
可能$filters
是一个引用,它在方法调用中被更改,或者pr
本身具有状态/副作用。通过删除对pr
的调用并将其替换为var_dump
,可以消除第二个选项。
您的代码段未提供足够的信息。这里你最好的选择是调试器。
编辑: 你的最后一个元素是一个参考(可能是一个参考的foreach的残余)。修复构建数组的代码,以便它不会在最后一个元素中留下引用。
答案 1 :(得分:1)
Seems like the bug with accessing a PHP array by reference
由于PHP内部工作的特殊性,如果引用数组的单个元素然后复制数组,无论是通过赋值还是在函数调用中通过值传递,引用都将复制为数组的一部分。这意味着对任一数组中任何此类元素的更改将在另一个数组(以及其他引用)中重复,即使数组具有不同的范围(例如,一个是函数内部的参数,另一个是全局的)!复制时没有引用的元素,以及在复制数组后分配给其他元素的引用将正常运行(即独立于另一个数组)。
这不会很快修复。这是一个深层次的问题,在实施和修复它会导致速度问题和许多其他问题,这是可以编码的东西,所以不应该造成大问题。