【问题标题】:PHP foreach loop stops after first loopPHP foreach 循环在第一个循环后停止
【发布时间】:2021-09-15 00:36:27
【问题描述】:

我想循环一个数组的每个值并检查它是否存在于另一个数组中,如果这样,从第二个数组中删除该值。并且只有第一个字母(迭代)被循环。字母 T 从数组中删除并停止循环。请解释一下。

<?php
function detect_pangram($string) { 
    $alphas = range('A', 'Z');
    $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string);
    $string = trim($string, ' ');
    $array = str_split($string);

      foreach($array as $value){
        if(in_array($value, $alphas))
        {
        unset($alphas[array_search($value, $alphas)]);
        continue;
        }
        
      }

var_dump($alphas);

  }
  detect_pangram("The quick brown fox jumps over the lazy dog.");
?>

【问题讨论】:

  • T 是唯一的大写字母。

标签: php loops


【解决方案1】:

你的foreach 循环实际上工作得很好(你可以通过在它的主体前面加上一个测试回声来见证这一点)。这是检查失败,因为in_array() 不(也不应该)关心字符寄存器:

in_array('h', range('A', 'Z')); // false

您应该立即使用strupper() 将字符串转换为大写:

// trim is not needed, you already drop whitespace with preg_replace
$string = strtoupper(preg_replace('/[^A-Z0-9\-]/i', '', $string));

// btw, you should consider dropping all the non-A-Za-z characters, including 0-9 and -
// as their presence doesn't change the outcome of detect_pangram() 

...或大写字母,然后再根据 A...Z 范围检查它。

作为旁注,请在清空 $alphas 数组后立即考虑 return true

【讨论】:

  • 哇,我什至没有考虑大写/小写。所以我走在正确的轨道上,只是错过了那部分。谢谢!
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多