数组值意外更改

时间:2010-06-10 11:11:40

标签: php mysql arrays find cakephp-1.2

我正在使用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 个答案:

答案 0 :(得分:1)

可能$filters是一个引用,它在方法调用中被更改,或者pr本身具有状态/副作用。通过删除对pr的调用并将其替换为var_dump,可以消除第二个选项。

您的代码段未提供足够的信息。这里你最好的选择是调试器。

编辑: 你的最后一个元素是一个参考(可能是一个参考的foreach的残余)。修复构建数组的代码,以便它不会在最后一个元素中留下引用。

答案 1 :(得分:1)

Seems like the bug with accessing a PHP array by reference

由于PHP内部工作的特殊性,如果引用数组的单个元素然后复制数组,无论是通过赋值还是在函数调用中通过值传递,引用都将复制为数组的一部分。这意味着对任一数组中任何此类元素的更改将在另一个数组(以及其他引用)中重复,即使数组具有不同的范围(例如,一个是函数内部的参数,另一个是全局的)!复制时没有引用的元素,以及在复制数组后分配给其他元素的引用将正常运行(即独立于另一个数组)。

这不会很快修复。这是一个深层次的问题,在实施和修复它会导致速度问题和许多其他问题,这是可以编码的东西,所以不应该造成大问题。

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