首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrayaccess、Iterator和current()

Arrayaccess、Iterator和current()
EN

Stack Overflow用户
提问于 2012-01-10 20:12:36
回答 1查看 1.6K关注 0票数 3

我有实现Countable,ArrayAccess,Iterator和Serializable的类。我有一个数组形式的公共变量$data。和我的迭代实现:

代码语言:javascript
复制
public function rewind() { return reset($this->data); }
public function current() { return current($this->data); }
public function key() { return key($this->data); }
public function next() { return next($this->data); }
public function valid() { return isset($this->data[$this->key()]); }

$data循环中一切正常,但是如果我手动调用current($arrayObject),它会返回整个foreach数组,而不是其中的当前数组。我可以使用current($arrayObject->data),但希望尽可能保留本机阵列功能。

这是php行为,对吗?(不是我的代码错误),有没有解决这个问题的办法,没有自定义函数(祈祷)?

编辑完整类的简化版本(工作中):

代码语言:javascript
复制
$arrayObject = mysqli_fetch_object($this->result_id, "simpleMysqliResult ", array(array(
        "fields" => array( "field1", "field2", "field3" )
    )));
class simpleMysqliResult implements Countable, ArrayAccess, Iterator, Serializable {

    public $data = array();

    public function __construct($input) {
        extract($input);
        foreach ($fields as $field) {
            $this->data[$field] = $this->{$field};
            unset($this->{$field});
        }
    }

    public function &toArray() { return $this->data; }
    public function offsetGet($index) { return $this->data[$index]; }
    public function offsetSet($index, $value) { $this->data[$index] = $value; }
    public function offsetUnset($index) { unset($this->data[$index]); }
    public function offsetExists($index) { return $this->offsetGet($index) !== null; }
    public function count() { return count($this->data); }
    public function rewind() { return reset($this->data); }
    public function current() { return current($this->data); }
    public function key() { return key($this->data); }
    public function next() { return next($this->data); }
    public function valid() { return isset($this->data[$this->key()]); }
    public function serialize() { return serialize($this->data); }
    public function unserialize($str) { return $this->data = unserialize($str); }

    public function __call($func, $argv) {
        if (!is_callable($func) || substr($func, 0, 6) !== 'array_')
        {
            throw new BadMethodCallException(__CLASS__.'->'.$func);
        }
        return call_user_func_array($func, array_merge(array($this->data), $argv));
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 21:03:34

尝试将您的数据设置为私有模式。我怀疑您有一个外部过程在玩弄它并对其进行更改。我复制了你的类,并稍微修改了你的构造函数,因为我没有和你一样的输入,我没有得到任何奇怪的行为。最后,您可能还想了解一下为什么要提取($input),只要使用$input'fields‘或$input->字段就可以了,它仍然可以工作。

以下是我的更正:

代码语言:javascript
复制
private $data = array();

public function __construct($input) {
    foreach($input['fields'] as $field) {
        $this->data[$field] = $input[$field];
    }
}

以下是我的测试

代码语言:javascript
复制
$data = array('fields' => array('id', 'name'), 'id' => 1, 'name' => 'Franco');
$smr = new simpleMysqliResult($data);
var_dump($smr->current());
var_dump($smr->current());
var_dump($smr->current());
var_dump($smr->current());
var_dump($smr->next());
var_dump($smr->current());
var_dump($smr->current());

并且我的输出是ok的

代码语言:javascript
复制
int(1) int(1) int(1) int(1) string(6) "Franco" string(6) "Franco" string(6) "Franco" 

所以就像我说的,我认为你的问题主要在于你的$data是公开的,而其他的东西在玩弄它。

它在于你的构造器,我必须修复它才能让它在我这边工作。

祝好运

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8803092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档