while数组php
A. php使用while循环赋值给数组
先问你几点有关你这个代码的问题,不然我没办法回答,问题都在后面的注释处
$lp=mysql_query("SELECT * FROM zp where sID=$row[ID]");
//该查询中$row[ID]怎么来的,$row[ID]是在后面的循环体中定义的,这里走来就出现不出错吗
$lp_num=mysql_num_rows($lp);
while($row = mysql_fetch_array($lp))
{
$lp_xm[]=$row[xm];$lp_birth[]=$row[birth];$lp_dead[]=$row[dead];$lp_ID[]=$row[ID];
$q=0;
$en_num=0;
while($q<$lp_num)
{
$en=mysql_query("SELECT * FROM zp where sID=$lp_ID[$q]");//执行查询b
$en_num=mysql_num_rows($en)+$en_num;
//上面的值 $en_num应该等于数据行数X(1+2+3+4+5+...+总行数$lp_num),但是这一步是想做什么呢,不理解
while($row = mysql_fetch_array($en))
{
$en_xm[]=$row[xm];$en_birth[]=$row[birth];$en_dead[]=$row[dead];$en_ID[]=$row[ID];
}
echo "$en_num\n";
//问题中的不是说 输出$en_xm吗,怎么输出的是$en_num
$q++;
}
}
B. php中用while()、list()、each()遍历数组后,数组指针是停留在数组外面还是在数组最后一个单元上
停留在最后一个单元,所以无论是while 还是each,都有替代语法endwhile,来表示结束,关闭数据连接。
C. php数组指针的问题,while each遍历
一开始没看出你的问题来,差点答错了。你的问题是出现在&$value上,而不是数组的移动。
你foreach最后的$value是$name['name4']的引用,while的循环中,不断变化着$name['name4']的值,你可以在while循环最后每次都打印完整数组看出效果。
关键点:变量引用在循环结束后没有删除,你在foreach后面加一句unset($value);就没问题了
---邪恶的分割线---
这里涉及到数组遍历时指针移动问题。
1、foreach循环的每次循环中,数组内部的指针向前移一步,直到越界退出
2、当foreach开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在foreach循环之前调用reset()。
3、each()返回array数组中当前指针位置的键/值对并向前移动数组指针
4、如果内部指针越过了数组的末端,则each()返回FALSE
你的例子,前面的foreach遍历会导致数组$name最终指针越界退出,然后,如果没有使用reset($name),则$name的指针是foreach执行后的位置,是越界的,直接使用each会返回false
D. 关于PHP while循环数组相加问题
$countnum = 0;//要统计相加的变量
while($forumattach = DB::fetch($queryattach)) {
$countnum += intval($forumattach['size']);//每次都把数值添加到countnum这个变量上面
}
echo $countnum;//这样就能得到总数了
E. php while遍历数组
while (list($key,$val)=each($apple)) {
echo $apple[$key];
}
建议使用foreach
F. PHP中使用while循环写入数组的方法
循环写入示例如下(其他循环写入原理也是一样的):
<?php
//定义空数组
$arr=array();
//循环初始化条件
$i=1;
//根据判断进行while循环
while($i<=10){
//写入数组
$arr[]="元素".$i;
//递增
$i++;
}
print_r($arr);
/*
*Array
(
[0]=>元素1
[1]=>元素2
[2]=>元素3
[3]=>元素4
[4]=>元素5
[5]=>元素6
[6]=>元素7
[7]=>元素8
[8]=>元素9
[9]=>元素10
)*/
?>
G. php foreach、while性能比较
foreach是对数组副本进行操作(通过拷贝数组),而while则通过移动数组内部指标进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。
在循环里进行的是数组“读”操作,则foreach比while快:
复制代码
代码如下:
foreach
($array
as
$value)
{
echo
$value;
}
while
(list($key)
=
each($array))
{
echo
$array[$key];
}
在循环里进行的是数组“写”操作,则while比foreach快:
复制代码
代码如下:
foreach
($array
as
$key
=>
$value)
{
echo
$array[$key]
=
$value
.
'...';
}
while
(list($key)
=
each($array))
{
$array[$key]
=
$array[$key]
.
'...';
}
总结:通常认为,foreach涉及到值复制,一定会比while慢,但实际上,如果仅仅是在循环里进行数组的读操作,那么foreach是很
快的,这是因为PHP采用的复制机制是“引用计数,写时复制”,也就是说,即便在PHP里复制一个变量,最初的形式从根本上说其实
仍然是引用的形式,只有当变量的内容发生变化时,才会出现真正的复制,之所以这么做是出于节省内存消耗得目的,同时也提升了
复制的效率。这样看来,foreach的高效读操作就不难理解了。另外,既然foreach不适合处理数组写操作,那么我们可以得出一个结
论,多数情况下,类似foreach
($array
as
$key
=>
$value)形式的做数组写操作得代码都应该被替换成while
(list($key)
=
each($array))。这些技巧产生的速度差异在小项目里可能并不明显,但是在类似框架这样的大项目中,一次请求动辄便会涉及到几
百几千几万次数组循环操作,差异就会明显放大。
H. 关于php数组while循环问题!
要不就把print_r($num);放到for循环外面,要么就在每次打印后unset($num)一下。
因为你这个$num是数组,循环一次就累加了一次,你没有清空就会一直累加。