【问题标题】:PHP array to string conversion notice with CachingIterator使用 CachingIterator 的 PHP 数组到字符串转换通知
【发布时间】:2018-04-19 18:13:20
【问题描述】:

我已经在 Stackoverflow 上对这个主题进行了一些搜索,但是据我所知,我没有将数组视为字符串?

我收到的信息是:

第 42 行 X 中数组到字符串的转换

我的代码的第 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
)

所以,总结一下:

  • 我们有一个数组的确认输出
  • 我们知道ArrayIterator() 需要array 作为参数
  • 我们知道 CachingIterator() 需要 Iterator 作为参数
  • 我们知道foreach() 可以遍历Iterator

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;
}

注意:第 6 行 /Users/bp/tmp/test.php 中的数组到字符串的转换

一个

注意:第 6 行 /Users/bp/tmp/test.php 中的数组到字符串的转换

B

【问题讨论】:

  • 如果你var_dump( $collection );你看到了什么?
  • 只有你能确定一切,但我们不是。显示var_dump( $collection );的使用代码和输出
  • 我非常怀疑那是产生错误的行。
  • 另外,在你的foreach() 行之后会出现什么?
  • 如果您在 foreach 之前添加了一个 exit,您还会收到错误消息吗?

标签: php spl


【解决方案1】:

简短的回答是,您无意中要求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 类设置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()时不会完成上述操作。

【讨论】:

  • 正确的解释和正确的答案。我希望 OP 会考虑这一点,然后决定选择最佳答案。
  • 我对这个答案投了赞成票。我支持我对@MonkeyZeus 回答的评论,即该海报是第一个提供答案而不是尖刻的 cmets 的人。至于他们是否准备承认他们的回答状态,我将把它留给 MonkeyZeus。如果答案是肯定的,我会回来做这件事。否则,我会将其保留为“先回答,先得分”。
  • 你太仁慈了,@LittleCode。如果此答案对您有所帮助,并出现在遇到相同问题的其他人的搜索结果中,那才是真正重要的。 :-)
  • @LittleCode 这是一个非常好的答案,在解释情况方面做得很好。随意接受您认为对您最有帮助的任何答案,并将帮助未来的读者。出于某种原因,忽略大声喧哗的用户总是安全的。此外,我承认您的最小示例代码是我能够回答您的问题的唯一原因;否则,我只是要投票并继续前进,因为您的问题似乎并不琐碎,但我对该课程一无所知。
  • @MonkeyZeus 谢谢。我已经重新分配了答案。但我想强调它是 ONLY 因为额外的细节。我对向高大上的大声用户鞠躬的兴趣为零,我不在乎同侪压力。我仅根据所提供的答案做出了客观的决定。感谢这两个答案。
【解决方案2】:

你需要 CachingIterator::FULL_CACHEthis PHP docs comment

<?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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多