Zend\Stdlib\ArrayObjectはデフォルトの\ArrayObjectを置き換えます。
デフォルトの\ArrayObjectには多次元配列を削除できないバグがあるからそれをどうにかするよ、って言ってるっぽいんですがよくわかりません。
使ってみましょう。
Zend\Stdlib\ArrayObjectは、配列のようにループ内で自分を削除することができます。
\ArrayObjectも実は削除はできているのですが、でもそこでNoticeが発生しています。
これが修正したというバグなのでしょうか?
なお、Zend\Stdlib\ArrayObjectはPHPで実装されているだけあってデフォルトの\ArrayObjectよりは動作が遅めです。
まあ10万件のappendが0.04秒から0.08秒になる程度なのでそこまで影響はないでしょう。
それ以上増やすと速度より先にメモリ不足で落ちます。
と、ここまで書いたところで気がついたのですが、最初から開発経緯を見とけよって話です。
\ArrayObjectは、配列を突っ込んだときは配列内の値を消せないよ、という話だったようです。
デフォルトの\ArrayObjectには多次元配列を削除できないバグがあるからそれをどうにかするよ、って言ってるっぽいんですがよくわかりません。
使ってみましょう。
<?php header('Content-type: text/html; charset=UTF-8'); require_once('path/to/channel/vendor/autoload.php'); use Zend\Stdlib\ArrayObject; // Zend\Stdlib\ArrayObject $arrayobject = new ArrayObject(); $arrayobject->append(array('a')); $arrayobject->append(array('b')); foreach($arrayobject as $key=>$val){ // ループ内で自分自身を削除できる unset($arrayobject[$key]); } // \ArrayObject $default = new \ArrayObject(); $default->append(array('a')); $default->append(array('b')); foreach($default as $key=>$val){ // ここでArray was modified outside object and internal position is no longer valid unset($default[$key]); }
Zend\Stdlib\ArrayObjectは、配列のようにループ内で自分を削除することができます。
\ArrayObjectも実は削除はできているのですが、でもそこでNoticeが発生しています。
これが修正したというバグなのでしょうか?
なお、Zend\Stdlib\ArrayObjectはPHPで実装されているだけあってデフォルトの\ArrayObjectよりは動作が遅めです。
まあ10万件のappendが0.04秒から0.08秒になる程度なのでそこまで影響はないでしょう。
それ以上増やすと速度より先にメモリ不足で落ちます。
と、ここまで書いたところで気がついたのですが、最初から開発経緯を見とけよって話です。
<?php // Zend\Stdlib\ArrayObject $arrayobject = new Zend\Stdlib\ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS | ArrayObject::STD_PROP_LIST); $arrayobject['foo'] = array('bar'=>'baz'); unset($arrayobject['foo']['bar']); var_dump($arrayobject['foo']); // array(0) { } // 消えている // \ArrayObject $default = new \ArrayObject(array(), \ArrayObject::ARRAY_AS_PROPS | \ArrayObject::STD_PROP_LIST); $default['foo'] = array('bar'=>'baz'); unset($default['foo']['bar']); // Notice: Indirect modification of overloaded element of ArrayObject has no effectが発生 var_dump($default['foo']); // array(1) { ["bar"]=> string(3) "baz" } // 消えてない
\ArrayObjectは、配列を突っ込んだときは配列内の値を消せないよ、という話だったようです。
PR