【问题标题】:Compare and display characters if they are in string/array or if they are dont exists如果字符在字符串/数组中或不存在,则比较并显示字符
【发布时间】:2017-03-14 03:53:32
【问题描述】:

关于如何将字符串的字符与字符串或数组中的元素进行比较,我无法理解。

我正在寻找的结果是这样的,我想检查单词 concept 中的字母 c

同时仍然显示单词concept,并为第一次出现c 使其加粗或下划线以使其突出。

我觉得我在正确的轨道上,只需要一点指导。

<?php
 $word = "conrad"; 
 $str = array("Concept", "Support", "Design", "Fresh", "Aged","Glad");


  echo $test = implode(" ", $str). '<br />';

 foreach(str_split($word) as $position => $letter) {
   if(stripos($str[$position], $letter) !== false) { 

    echo $letter .' found in <b>'. $str[$position] . '</b>';

    $pos = stripos($str[$position], $letter);

    echo ' posistion '. $pos .'<br>';

    }
   }
   var_dump(str_split($word), $position, $letter, $str[$position], $test);

  ?>

如果有任何不清楚的地方,请告诉我,我会尝试更好地澄清事情。

谢谢!

【问题讨论】:

    标签: php arrays string character


    【解决方案1】:
    <?php
    $word = "conrad";
    $str = array("Concept", "Support", "Design", "Fresh", "Aged","Glad");
    
    $test = implode(" ", $str)";
    echo "{$test}<br />;
    
    foreach(str_split($word) as $position => $letter) {
        if(stripos($str[$position], $letter) !== false) {
            $message = "{$letter} found in ";
            // This is very basic, but gets the job done quickly
            $firstLetterFlag = false;
            foreach(str_split($str[$position]) as $strLetter) {
                if (
                    strtolower($strLetter) === strtolower($letter) &&
                    $firstLetterFlag === false
                ) {
                    $firstLetterFlag = true;
                    $strLetter = "<b>{$strLetter}</b>";
                }
                $message .= $strLetter;
            }
            $pos = stripos($str[$position], $letter);
            $message .= " position {$pos}<br>";
            echo $message;
        }
    }
    
    var_dump(str_split($word), $position, $letter, $str[$position], $test);
    

    您应该使用嵌套的foreach 并正确插入您的字符串。请注意,大括号不是必需的,但更恰当地表示正在插入一个变量。

    编辑

    正如Robby Cornelissen在cmets中指出的那样,他的方法比我的要快得多。我错误地说正则表达式几乎总是会减慢你的速度。正如他正确指出的那样,这是一个概括。诸如preg_replace 之类的正则表达式函数比其对应的str_replace 慢一点。然而,正如我的回答,更多的代码通常会比 Robby 的更少的代码运行得更慢。无论如何,我们谈论的是纳秒。带来速度是我的错误,因为在这种情况下可以忽略不计。

    现在,我承诺更简洁的代码。玩了一会儿之后,很快就发现这不是递归函数的最佳用例。然而,函数式编程总是比过程式编程好,正如 Linus Torvalds 所说,“如果你需要 3 级以上的缩进,那么无论如何你都搞砸了,应该修复你的程序。”

    <?php
    $word = "conrad";
    $str = ["Concept", "Support", "Design", "Fresh", "Aged","Glad"];
    
    $test = implode(" ", $str)";
    echo "{$test}<br />;
    
    function findLetter($testWord = "", $wordList = [])
    {
        foreach(str_split($testWord) as $position => $letter) {
            if(stripos($wordList[$position], $letter) !== false) {
                echo buildMessage($letter, $wordList[$position]);
            }
        }
    }
    
    function buildMessage($letter, $word, $firstLetterFlag = false)
    {
        $message = "{$letter} found in ";
        foreach(str_split($word) as $wordLetter) {
            if (
                strtolower($wordLetter) === strtolower($letter) &&
                $firstLetterFlag === false
            ) {
                $firstLetterFlag = false;
                $wordLetter = "<b>{$wordLetter}</b>";
            }
            $message .= $wordLetter;
        }
        $pos = stripos($word, $letter);
        return "{$message} position {$pos}<br>";
    }
    
    findLetter($word, $str);
    

    【讨论】:

    • 有没有一种简单的方法来选择角色的第一个实例?所以对于第一个单词,它有两个 C。我不希望他们都只是第一个大胆。
    • 已编辑。 flag 还是很基础的,整体也很丑——压痕太多。如果以后有时间,我可能会写一个更简洁的递归函数。
    • 我将不胜感激,这对我来说是新的,所以越多越好。
    • "[A] 正则表达式几乎总是会减慢您的速度"。 一切都是平等的(将我的输出连接成一个字符串,去掉输出中的额外内容,摆脱了var_dump),超过 1000 次执行,我的正则表达式版本比你的快 1.6~1.8 倍。实事求是胜于概括。
    • 不能与硬数据争论。将删除它。这只是我从其他人那里收集到的,没有自己进行任何测试。正如您所说,不是基于经验主义的概括。
    【解决方案2】:

    我只修改了几行。我使用 substr 函数获取您选择的字符之前的部分,然后插入您的字符(用粗体标签包裹),然后回显字符串的其余部分。

    <?php
    $word = "conrad";
    $str = array(
        "Concept",
        "Support",
        "Design",
        "Fresh",
        "Aged",
        "Glad"
    );
    $string = "conrad";
    echo $test = implode(" ", $str) . '<br />';
    
    foreach(str_split($word) as $position => $letter)
        {
        if (stripos($str[$position], $letter) !== false)
            {
            $pos = stripos($str[$position], $letter);
            $currentString = $str[$position];
            echo $letter . ' found in ' . substr($currentString, 0, $pos) . "<b>" . $letter . "</b>" .  substr($currentString, $pos + 1) . "<br />";
            echo ' posistion ' . $pos . '<br />';
            }
        }
    
    var_dump(str_split($word) , $position, $letter, $str[$position], $test);
    ?>
    

    【讨论】:

      【解决方案3】:

      这是一个使用正则表达式的解决方案:

      $word = "conrad"; 
      $strs = array("Concept", "Support", "Design", "Fresh", "Aged", "Glad");
      
      foreach($strs as $i=>$str) {
          echo preg_replace('/' . $word{$i} . '/i', '<b>${0}</b>', $str, 1) . "<br>\n";
      }
      

      打印出来(带有一些样式):

      b { color: red; }
      <b>C</b>oncept<br>
      Supp<b>o</b>rt<br>
      Desig<b>n</b><br>
      F<b>r</b>esh<br>
      <b>A</b>ged<br>
      Gla<b>d</b><br>

      【讨论】:

      • 我什至没有想过使用正则表达式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      相关资源
      最近更新 更多