【问题标题】:php how to loop through array until condition is met?php如何遍历数组直到满足条件?
【发布时间】:2012-02-01 19:58:52
【问题描述】:

我有一个数据库表,其中包含需要显示的图像。在我看来,我想为每个调用的结果显示多达 10 张图像。我已经设置了一个数组,其中包含每个结果最多可用的 20 张图像(有些结果只有几张图像,甚至根本没有)。所以我需要一个循环来测试数组值是否为空,如果是,则移动到下一个值,直到它得到 10 个结果,或者它到达数组的末尾。

我认为我需要做的是根据测试结果为自己构建第二个数组,然后使用该数组执行常规循环以显示我的图像。类似的东西

<?php 
  $p=array($img1, $img2.....$img20);

  for($i=0; $i<= count($p); $i++) {
    if(!empty($i[$p])) {
    ...code
    }
  }
?>

如何告诉它将非空的数组值存储到新数组中?

【问题讨论】:

  • 我认为您的意思是 $p[$i] 而不是 $i[$p]
  • 是要输出 10 张图片,还是要将数组拆分为多个数组,每个数组包含 10 张图片?或者你到底想做什么?
  • 只有 10 个,没有多个数组。正在研究以下解决方案。

标签: php arrays for-loop


【解决方案1】:

你可以这样做:

$imgs = array(); $imgs_count = 0;
foreach ( $p as $img ) {
    if ( !empty($img) ) {
        $imgs[] = $img;
        $imgs_count++;
    }
    if ( $imgs_count === 10 ) break;
}

【讨论】:

  • 这实际上对我有用,除了大约一半的时间,我得到这个可怕的“未找到基表或视图......表 cloudmed.images 不存在”而不是我的小调试页面(顺便说一下,我正在使用 Cakephp)。更糟糕的是,如果我继续尝试重新加载页面,Google chrome 会阻止我访问该页面:错误 139 (net::ERR_TEMPORARILY_THROTTLED):对服务器的请求已被暂时限制。我到底做错了什么?!!!
  • 我认为我的服务器正在向我撒尿,否则,这很好用。谢谢!
  • 不,今天仍在发生。任何人都知道这个函数中发生了什么可能会导致这种情况?
  • 这实际上是针对 DDOS 的内置 Chrome 预防措施...检查google.com/support/forum/p/Chrome/…
  • 是的,我可以接受 Chrome 消息。在我加载此页面的时间大约有一半的时间里,肯定是这个函数导致了错误。它不会发生在我的应用程序的其他任何地方。如果有人知道为什么我的服务器会因此而对我产生影响,我愿意改变一切。
【解决方案2】:

您可以简单地调用array_filter() 来仅获取数组中的非空元素。 array_filter() 可以采用回调函数来确定要删除的内容,但在这种情况下,empty() 将评估为 FALSE,并且不需要回调。任何计算 empty() == TRUE 的值都将被删除。

$p=array($img1, $img2.....$img20);
$nonempty = array_filter($p);

// $nonempty contains only the non-empty elements.

// Now dow something with the non-empty array:
foreach ($nonempty as $value) {
   something();
}

// Or use the first 10 values of $nonempty
// I don't like this solution much....
$i = 0;
foreach ($nonempty as $key=>$value) {
  // do something with $nonempty[$key];
  $i++;
  if ($i >= 10) break;
}

// OR, it could be done with array_values() to make sequential array keys:
// This is a little nicer...
$nonempty = array_values($nonempty);
for ($i = 0; $i<10; $i++) {
   // Bail out if we already read to the end...
   if (!isset($nonempty[$i]) break;

   // do something with $nonempty[$i]
}

【讨论】:

  • 谢谢!不幸的是,由于某种原因,它仍然持有空值,因为当数组的第一部分($p 数组)中的图像少于 10有两个表的结果)。您可以在此处查看输出:rentcondos4less.cloudmedia.biz/lodgings/debug
  • @HeatherWalters 我刚刚在上面进行了更改。忘了如果你从数组中删除元素,对应的键就不一定是连续的了。
  • 查看我上面对@felipelavinz 的评论,最重要的是,当我实现您的代码(以及他的......公司糟透了?我的职能是否导致洛杉矶的灯光变暗?)
【解决方案3】:
$new_array[] = $p[$i];

$p[$i] 存储到$new_array 的下一个元素中(又名array_push())。

【讨论】:

    【解决方案4】:

    您是否考虑过在 sql 查询中限制您的结果?

    select * from image where img != '' limit 10
    

    这样一来,您总是会得到最多 10 个不为空的结果。

    【讨论】:

      【解决方案5】:

      ẁhile 循环可能是您正在寻找的 http://php.net/manual/en/control-structures.while.php

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多