PHP 使用 CachingIterator 的数组到字符串转换通知

PHP array to string conversion notice with CachingIterator

我已经就此主题在 Whosebug 上进行了一些搜索,但据我所知,我没有将数组视为字符串?

我收到的消息是:

Array to string conversion in X on line 42

我的代码的第 42 行是 foreach 循环的开头:

foreach ($collection as $element) {

变量$collection是一个基于数据库输出的缓存迭代器:

$collection=new \CachingIterator(new \ArrayIterator($this->dbData));

如果我在$this->dbDataprint_r(),我肯定得到一个数组:

Array
(
    [0] => Array
        (
            [c_id] => A
 )

    [1] => Array
        (
            [c_id] => B
)

所以,总结一下:

TL;DR 我真的不确定我在这里将什么视为字符串?

编辑添加....

即使我大大简化了我的代码,我仍然可以重现:

<?php
error_reporting (E_ALL | E_STRICT);
ini_set ('display_errors', 1);
$arrX=array(array("c_id"=>"A"),array("c_id"=>"B"));
$collection=new \CachingIterator(new \ArrayIterator($arrX));
foreach($collection as $element) {
echo $element["c_id"].PHP_EOL;
}

Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6

A

Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6

B

每个 this PHP docs comment

需要 CachingIterator::FULL_CACHE
<?php
$arrX = array(
    array( "c_id" => "A" ),
    array( "c_id" => "B" )
);
$collection = new \CachingIterator( new \ArrayIterator( $arrX ), CachingIterator::FULL_CACHE );
foreach( $collection as $element )
{
    echo $element["c_id"].PHP_EOL;
}

简短的回答是,您无意中要求 CachingIterator 在迭代期间将子数组转换为字符串。要不这样做,请不要使用 CachingIterator::CALL_TOSTRINGCachingIterator::TOSTRING_USE_INNER 标志。

您可以不设置标志,方法是使用 0 作为 $flags 参数的值,或者使用不同的标志:这可以在构造函数中完成,或者在初始化之后使用 CachingIterator::setFlags()

例如:

$array = [["c_id" => "A"], ["c_id" => "B"]];
$collection = new CachingIterator(new ArrayIterator($array), 0);
foreach ($collection as $element) {
    // no E_NOTICE messages, yay!
}

还有几句解释...

默认情况下,CachingIterator class 设置 CachingIterator::CALL_TOSTRING 标志,如 PHP manual page on CachingIterator.

中所述
public __construct ( Iterator $iterator [, int $flags = self::CALL_TOSTRING ] )

当设置此标志(或 CachingIterator::TOSTRING_USE_INNER 标志)并调用 CachingIterator::next() 方法时(即在迭代期间)当前值(在本例中为每个子数组)或内部迭代器(在本例中为 ArrayIterator)分别转换为字符串并在内部保存。当使用其中一个标志时,此字符串值是从 CachingIterator::__toString() 返回的值。

使用任何其他标志时,调用 CachingIterator::next() 时不会执行上述操作。