知道我们在哪个方面处于预期状态

时间:2011-03-05 19:35:36

标签: php

我有一个数组:

$array=array('key1'=>'value1','key2'=>'value2','value3');

和foreach:

foreach($array as $v){
     //do something
}

有没有办法在foreach中知道我们正在解析哪个元素?

(不做类似的事情)

$count=0;
foreach($array as $v){
    $count++;
    // do something
}

感谢

EDIT1:

对不起,也许我不清楚: 我不想知道密钥,但我需要知道foreach中剩下多少元素。 (这就是为什么我用$ count做的例子)

6 个答案:

答案 0 :(得分:3)

您可以使用扩展ArrayIterator的类:

class FooArrayIterator extends ArrayIterator {
    private $offset = 0;
    public function next() {
        $this->offset++;
        return parent::next();
    }
    public function rewind() {
        $this->offset = 0;
        parent::rewind();
    }
    public function seek($offset) {
        if ($offset >= 0 && $offset < $this->count()) {
            $this->offset = $offset;
        }
        parent::seek($offset);
    }
    public function offset() {
        return $this->offset;
    }
}

示例:

$array = array('value1','value2','value3');
$iter = new FooArrayIterator($array);
foreach ($iter as $v) {
    echo ($iter->count() - $iter->offset() - 1).' more';
}

答案 1 :(得分:2)

您可以获得实际索引:

foreach ($array as $index => $value) {
}

如果使用关联数组,则无法分辨内部数组指针的当前位置。只有间接方式:使用以下方法搜索数组键中的当前键:

foreach ($array as $index => $value) {
    $position = array_search ($index, array_keys ($array));
    echo ($position);
}

...但我猜count++是一种更加资源友好的方式。

答案 2 :(得分:1)

You can:


$count = count($array);
foreach($array as $key => $value) {
 $count--;

 //$count elements are left 
}

答案 3 :(得分:0)

是的,有点。

foreach($array as $key=>$value) 
//  code
}

$ key将是数组键,但如果您想要实际的迭代整数计数,并且键没有按顺序编号,或者是字符串,则必须使用原始帖子中的计数器。

编辑:要处理最后一个元素而不实现计数器,你可以使用(如果键是int)

 $foo = ($key == count($array)-1) ? "last element" : "any other element";

(从手册评论中剔除 - http://php.net/manual/en/control-structures.foreach.php

编辑:如果您的密钥不是整数,您可以在上面的代码中创建一个计数器,并用计数器变量替换$ key。

答案 4 :(得分:0)

你有点挑剔:)

顺便说一下,技巧是将关联数组转换为索引数组:

foreach ( array_values($array) as $key=>$value ){
    echo $key; //yes, it will be an INT
    echo ( count($array) - $key );
}

答案 5 :(得分:0)

如果没有一些预处理功能,例如您的count()版本,则无法知道您在关联数组中的位置。最多你可以检查你是否在最后end(),但不能保证foreach()将检索单个元素的顺序。通常它与添加到阵列中的顺序相同,但不是保证。

另一个预处理选项是

$keys = array_keys($array);
$cnt = count($keys)
for ($i = 0; $i < $cnt; $i++) {
     $element = $array[$keys[$i]];
}

和$ i会告诉你到底有多远。