一、遍历数组的三种方式
(1)for循环:只能遍历索引数组
$arr=array('a','b','c');
$size=count($arr);
for ($i=0;$i<$size;$i++){
echo $arr[$i];
}
(2)foreach循环:可以遍历索引数组和关联数组
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
foreach ($arr as $val){
echo $val.'</br>';
}
foreach ($arr as $key=>$val){
echo $key.'=>'.$val.'</br>';
}
(3)while、list()、each()组合循环:可以遍历索引数组和关联数组
each函数:
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
$lst=each($arr);
var_dump($lst);
/*结果
array (size=4)
1 => int 1
'value' => int 1
0 => string 'one' (length=3)
'key' => string 'one' (length=3)
*/
//下一次each时将移动到下一个元素
$lst=each($arr);
var_dump($lst);
/*结果
1 => int 2
'value' => int 2
0 => string 'two' (length=3)
'key' => string 'two' (length=3)
*/
list函数:将数组中的以整数为键值的元素按键值从小到大的顺序赋给自己的参数。
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
$lst=each($arr);
var_dump($lst);
/*结果
array (size=4)
1 => int 1
'value' => int 1
0 => string 'one' (length=3)
'key' => string 'one' (length=3)
*/
list($key,$val)=$lst;
echo $key.'=>'.$val;
//结果 one=>1
while、list()、each()组合循环:
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
while (list($key,$val)=each($arr)){
echo $key.'=>'.$val.'</br>';
}
/*结果
one=>1
two=>2
three=>3
*/
二、foreach引用修改问题
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
foreach ($arr as &$k){
$k=$k*2;
}
var_dump($arr);
foreach ($arr as $k){
echo $k."</br>";
}
var_dump($arr);
结果是:
Why?
Because:
解决方法:
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
foreach ($arr as &$k){
$k=$k*2;
}
var_dump($arr);
unset($k);//取消引用
foreach ($arr as $k){
echo $k."</br>";
}
var_dump($arr);
结果:
三、指针重置
while、list()、each()组合不会reset(),即指针重置,foreach遍历会对数组进行reset()操作。
什么意思呢?
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
while (list($key,$val)=each($arr)){
echo $key.'=>'.$val.'</br>';
}
/*结果
one=>1
two=>2
three=>3
*/
while (list($key,$val)=each($arr)){
echo $key.'=>'.$val.'</br>';
}
/*结果为空 --> 指针还是指向最后一个
*/
$arr=array(
'one'=>1,
'two'=>2,
'three'=>3
);
while (list($key,$val)=each($arr)){
echo $key.'=>'.$val.'</br>';
}
/*结果
one=>1
two=>2
three=>3
*/
reset($arr);//重置指针
while (list($key,$val)=each($arr)){
echo $key.'=>'.$val.'</br>';
}
/*结果
one=>1
two=>2
three=>3
*/
而foreach内置reset()函数,在调用完foreach的时候,系统指针就会重新指向第一个,因此不需要在foreach之前调用reset()函数!