我遇到了一个foreach的问题,他的主要建议是检查服务器是否已启动,然后访问该文件,并且我被困在一个foreach上,我想让它重复一步。例如,我有以下代码:
<?php
$Array = array("one","two","tree","four");
next($Array);
$i = 0;
foreach($Array as $Key=>$Value)
{
$i++;
echo "Key=".$Key." VAL=".$Value."<br>";
if($Key==2) prev($Array);
if($i==10) break;
}
?>
输出的:
Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=3 VAL=four
我想让它输出
Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree // till the $i is 10 therefore it's exits the foreach trough break;
我尝试过prev($ Array);没有结果。
我一直在考虑
while(true)
{
if(server exists)
{
echo "server is good";
break;
}
else
{
echo "server is BAD ... continueing";
prev($Array);
}
}
但这对我来说也不起作用...... 任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
这符合您的需求:
$arr = array('one', 'two', 'three', 'four');
$val = null;
for ($i = 0; $i < 10; $i++) {
if (isset($arr[$i])) {
$val = $arr[$i];
}
echo 'key=' . $i . ' val=' . $val . '<br />';
}
答案 1 :(得分:0)
http://php.net/manual/en/control-structures.foreach.php
问题#1:
当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素
因此,你的第一个next()调用是无用的。
问题#2:
由于foreach依赖于内部数组指针,因此在循环内更改它可能会导致意外行为。
答案 2 :(得分:0)
Foreach非常适合像skynorth一样有限大小的数组。
为此,我建议使用Do While循环,它保证至少执行一次循环,允许您在服务器上进行检查。
答案 3 :(得分:0)
我认为你是在追求这样的事情:
<?php
$myArray = array('one','two','tree','four');
$length = count($myArray );
$attempts = 0;
for ($i = 0; $i < $length; ++$i) {
echo 'Key=' . $i . ' VAL=' . $myArray[$i] . '<br>';
if ($i === 2) {
--$i;
}
if (attempts >= 10) {
break;
}
++$attempts;
}
?>
注释
无论数组大小如何,都会在10次迭代后结束。如果您的阵列长度为20个项目,那么这是行不通的。
我假设你有一些你希望使用的实际条件,而不是检查一个密钥为2的项目,在这种情况下,限制特定条件下的尝试可能更有意义,而不是限制整个阵列 - 但你最了解你的要求,如果你想要它可以寻求更多的帮助。
答案 4 :(得分:0)
for ($i = 0; $i < count($Array) - 2; $i++) {
echo "Key=$i VAL={$Array[$i]}\n";
}
for ($j = $i; $j < 10; $j++) {
echo "Key=$i VAL={$Array[$i]}\n";
}
答案 5 :(得分:0)
正如前面所述,你不能在foreach循环中使用prev($ array) 你应该用while或for循环迭代
但除此之外,你还会遇到其他麻烦......
php是一种非常线性的语言,只要代码是INSIDE这样的循环它就不能做任何其他事情所以这个php必须作为一个单独的线程运行,并且因为它应该做某事(返回一个值)它会锁定不仅仅是本身,而是抓住这个价值的线索。 并且它很可能会在一定时间后中断,你可以在该循环中扩展php max脚本执行时间以防止它死亡,但你也必须对getter做同样的事情..你不应该做那样的事情(这就是为什么这里没有代码)所以,如果我说得对,你想要访问远程服务器上的文件......
你可以简单地说:while (!$handle) // file not opened i.e. server not accessible
{
$handle = fopen("http://www.example.com/", "r"); //try to fopen file
}
只要未设置$ handle或将其设置为FALSE,它也将被锁定在循环内 并且它会让你的脚本在最长执行时间后死亡(通常为60秒) 一旦$ handle被设置为远程服务器html输出的文件句柄(在这种情况下),它将正常执行以下所有代码 如果你已经完成阅读$ handle,请不要忘记用
关闭它fclose($handle);
答案 6 :(得分:0)
$Array = array("one","two","tree","four");
$i = 0;
foreach($Array as $Key=>$Value)
{
$count = 0;
// Registra a referência do
start:
$i++;
echo "Key=".$Key." VAL=".$Value."\n";
if($Key == 2 && $count < 10) {
// Count
$count++;
// Return to start loop
goto start;
}
}
// OUTPUT
Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=3 VAL=four