Я пытаюсь получить количество вхождений символов в строке - PullRequest
0 голосов
/ 26 февраля 2020

Ниже приведен код, который я пробовал, где количество показаний неправильное. Пожалуйста, помогите мне добраться туда, где мне не хватает логи c. Я прилагаю код, который я пробовал до сих пор. PS Примечание: - Я не собираюсь использовать более встроенную функцию php, поэтому я создал функцию для длины строки.

error_reporting(E_ALL);
$string = "ssddk";

function checkString($addinString, &$stringBK) {
    if (empty(count($stringBK))) {
        $stringBK[] = $addinString;
        return false;
    }
    foreach ($stringBK as $key => $val) {
        if ($addinString == $val) {
             return true;
        }
    }

    $stringBK[] = $addinString;
    return false;
}

for ($i = 0; $i < checkstrlength($string); $i++) {
    $count = 0;
    for ($j = 0; $j < checkstrlength($string); $j++) {
        if ($string[$i] == $string[$j]) {
            if (checkString($string[$i], $stringBK)) {
                continue 2;
            }

            $count++;
            echo "Column => " . $string[$j] . " for count" .$count . "<br>";
        }
    }
}

function checkstrlength($string) {
    $count = 0;
    for ($i = 0; $string[$i] != ""; $i++) {
        $count++;
    }
    return $count;
}

Это дает вывод ниже,

Column => s for count1
Column => d for count1
Column => k for count1

Я ожидаю это как,

Column => s for count 2
Column => d for count 2
Column => k for count 1

1 Ответ

1 голос
/ 26 февраля 2020

Хорошо, здесь есть пара вещей, на которые можно посмотреть.

  • checkstrlength() имеет следующее значение l oop.

     for ($i = 0; $string[$i] != ""; $i++) {
    

    Формально говоря, мы обычно видим \0 завершающий символ в строке для завершения наш л oop. Но в PHP все является строкой. Таким образом, \0 теперь является строкой для сопоставления, а не для сопоставления символов. Лучше, мы делаем isset проверку, чтобы остановить наш l oop. Итак, код будет выглядеть так:

    for ($i = 0; isset($string[$i]); $i++) {
    
  • Во-вторых, вы не кэшируете результат, полученный из checkstrlength(). Сделай это. Также вы можете запустить внутренний l oop из самого $i. Нет необходимости go начинать заново. Итак, для l oop будет выглядеть так:

    $length = checkstrlength($string);
    
    for ($i = 0; $i < $length; $i++) {
       for ($j = $i; $j < $length; $j++) {
    
  • В-третьих, нет необходимости в empty и count проверках в checkString. Это также уменьшает вызовы встроенных функций . Вы можете просто l oop over и return true, если найдены. Если не найдено, мы добавляем его в любом случае. Так это будет выглядеть так:

     function checkString($addinString, &$stringBK) {
       foreach ($stringBK as $key => $val) {
         if ($addinString == $val) {
             return true;
         }
       }
       $stringBK[] = $addinString;
       return false;
     }
    
  • Теперь, в вашем вложенном l oop, вы добавляете его к $stringBK за пределами внутреннего l oop, потому что есть нет смысла проверять внутренний l oop, когда совпадают символы. Это потому, что если какой-то символ был посещен, зачем вообще инициализировать внутренний l oop. Просто проверьте выше и продолжайте поиск и подсчет. Также обратите внимание, что внутри внутреннего l oop есть операторы echo, что не имеет смысла, потому что мы еще не завершили подсчет. Давайте сделаем и распечатаем его снаружи внутреннего l oop в конце. Фрагмент кода:

    for ($i = 0; $i < $length; $i++) {
       $count = 0;
       if (checkString($string[$i], $stringBK)) {
          continue;
       }
       for ($j = $i; $j < $length; $j++) {
          if ($string[$i] == $string[$j]) {
             $count++;
          }
       }
    
      echo "Column => " . $string[$i] . " for count : " .$count,PHP_EOL;
    }
    

Окончательный демонстрационный код: https://3v4l.org/4dpST

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...