【问题标题】:if repeating response in foreach in while loop如果在while循环中在foreach中重复响应
【发布时间】:2017-06-29 00:16:06
【问题描述】:

我在 while 循环中的 foreach 中有一个 if。我正在另一个文本字符串中搜索一个字符串。

$base = 'someurl';
$url = $base;
while(1){
    $json = json_decode(file_get_contents($url));
    $more = $json->next_page;
    $next = $json->next_page_number;

    if($more){
        $url = $base.'&page='.$next;
    }else{
        break;
    }

    foreach($json as $data){
        $c = $data->text; // search in
        $s = 'string';
        $t = 'prefix1'.$s; // search for
        $m = 'prefix2'.$s; // search for

        if( (strpos($c, $t) || strpos($c, $m)) !== false ){
            echo '<p>hello, i found one or more ($t and/or $m) of the search criteria in the text string $c .</p>';
            break;
        }
    }
}

问题是我从 if 语句中得到了两次回显:(

我想要实现的是仅在 $c 中存在 $t 和/或 $m 时才使回显发生一次。

【问题讨论】:

  • 据我所见,由于while(1);,该行将无限期回显
  • @Jerodev - 是的,原始循环中有一个 if/break,我的错。查看更新的代码;)

标签: php if-statement foreach while-loop do-while


【解决方案1】:

好的,所以为我的特定问题找到了一个可行的解决方案(尽管我仍然不清楚为什么 if 语句响应得到了两次回显?)。

使用 preg_match 代替 strpos 给了我一个可行的解决方案 :)

if(preg_match('('.$t.'|'.$m.')', $c) === 1){
    // tis' the truth echoed thru eternity
}

【讨论】:

    【解决方案2】:

    好吧,我猜您收到了两次回声,因为您找到了 2 条符合您的条件的记录,这可能吗?

    如果是这样,并且您只想检查您的条件是否在数组上至少匹配一次,则可以在找到第一个匹配项后中断 foreach,例如:

    if( ( strpos( $c, $t ) || strpos( $c, $m ) ) !== false ){
        echo '<p>hello, I was told I was true</p>';
        break;
    }
    

    【讨论】:

    • 对不起,我已经试过了...只是忘了把它放在 desc 中。查看更新版本(仍然是相同的结果)。
    • 那么,您将在 while 循环(而不是 for)中的 URL 中获得 2 个不同“页面”中的匹配项。为什么不直接打印$url$c 当您获得匹配项时,您可以看到匹配的内容在哪里?
    猜你喜欢
    • 2014-10-19
    • 2021-08-10
    • 2013-02-04
    • 2014-12-05
    • 2020-04-11
    • 2015-09-23
    • 2012-01-12
    • 2014-10-02
    相关资源
    最近更新 更多