我有一个数组:
$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做的例子)
答案 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会告诉你到底有多远。