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'"
}

我数组中的值发生了变化,我不知道为什么?

有什么建议么?

4

2 回答 2

1

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

您的代码片段没有提供足够的信息。您最好的选择是调试器。

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

于 2010-06-10T11:16:28.137 回答
1

似乎是通过引用访问 PHP 数组的错误

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

这不会很快得到解决。这是实现中的一个根深蒂固的问题,修复它会导致速度问题和许多其他问题,这也是可以编码的东西,因此不会导致大量问题。

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

于 2010-06-10T12:24:49.793 回答