【问题标题】:Counting the number of letters in a word by PHP用PHP计算单词中的字母数
【发布时间】:2009-10-31 03:26:08
【问题描述】:

我想创建一个包含两列的数组。输出应仅包含单词中的现有字母及其数量。

以下代码的想要的输出

a 3
s 2
p 1

以下 PHP 代码有什么问题?

<?php

$alpha = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','z','y');

$word = "saapas";

for ( $i = 0; $i < count($word); $i++ ) {
        echo $word[$i] . "\n";

        $table[$word[$i]][]++;           // Problem here
}


// array_unique, array_combine and some method which can sort arrays by alphabets can be useful 

【问题讨论】:

  • 你在哪里使用 $alpha?

标签: php arrays


【解决方案1】:

PHP 有大量的 array functions,为此做了很多繁重的工作:

$keys = range('a', 'z');
$values = array_fill(0, 26, 0);
$freq = array_combine($keys, $values);
$word = "saapas";
$len = strlen($word);
for ($i=0; $i<$len; $i++) {
  $letter = strtolower($word[$i]);
  if (array_key_exists($letter, $freq)) {
    $freq[$letter]++;
  }
}
print_r($freq);

输出:

Array
(
    [a] => 3
    [b] => 0
    [c] => 0
    [d] => 0
    [e] => 0
    [f] => 0
    [g] => 0
    [h] => 0
    [i] => 0
    [j] => 0
    [k] => 0
    [l] => 0
    [m] => 0
    [n] => 0
    [o] => 0
    [p] => 1
    [q] => 0
    [r] => 0
    [s] => 2
    [t] => 0
    [u] => 0
    [v] => 0
    [w] => 0
    [x] => 0
    [y] => 0
    [z] => 0
)

如果要区分大小写试试:

$keys = array_merge(range('a', 'z'), range('A', 'Z'));
$values = array_fill(0, 52, 0);
$freq = array_combine($keys, $values);
$word = "saApas";
$len = strlen($word);
for ($i=0; $i<$len; $i++) {
  $letter = $word[$i];
  if (array_key_exists($letter, $freq)) {
    $freq[$letter]++;
  }
}
print_r($freq);

或计算任何字符:

$freq = array();
$word = "saApas";
$len = strlen($word);
for ($i=0; $i<$len; $i++) {
  $letter = $word[$i];
  if (array_key_exists($letter, $freq)) {
    $freq[$letter]++;
  } else {
    $freq[$letter] = 1;
  }
}
print_r($freq);

【讨论】:

    【解决方案2】:

    这可以使用您的输入字符数组,但您真的要为此任务构建一个静态数组吗?

    $table = array();
    $count = strlen($word);
    for ( $i = 0; $i < $count; $i++ ) {
        $letter = $word[$i];
        if ( !isset($table[$letter]) )
        {
            $table[$letter] = 0;
        }
        ++$table[$letter];
    }
    

    这是一种做同样事情的方法,但利用了 PHP 的本机函数:

    $ascii = count_chars($word, 1);
    $keys = array_keys($ascii);
    $chars = array_map('chr', $keys);
    $charCount = array_values($ascii);
    $table = array_combine($chars, $charCount);
    

    【讨论】:

      【解决方案3】:

      为什么复杂?

      $string = 'the grey fox jumps over the lazy dog';
      $words = explode(' ', $string);
      
      foreach ($words as $key => $value)
      {
          $words[$key] = count_chars($value, 1);
      }
      
      echo '<pre>';
      print_r($words);
      echo '</pre>';
      

      【讨论】:

        【解决方案4】:
            for ( $i = 0; $i < $alpha.length; $i++ ) {
        
                $count = 0;
                for($a = 0; $a < count($word); $a++)
                {
                    if($word[$a] == $array[$i]
                        $count++;
                }
                if($count > 0)
                     echo $array[$i] . " " . $count . "\n";
        
            }
        

        所以我们使用 2 个 for 循环。你试图做的事情有点低效。用于检查字母表的每个字符。第二个循环是遍历字符串并根据第一个循环所在的字母计算匹配项。

        编辑: 或者您可以在下面的行中添加一个零并从循环中删除回声。这仍然需要另一个循环来显示此表。

        $table[$word[$i]][0]++;
        

        【讨论】:

        • $alpha.length?语言错误:)
        【解决方案5】:

        试试这个。它是一种单次迭代方法,更快更简单!

        <?php
        
        $word = "saapas";
        $result;
        for ( $i = 0; $i < strlen($word); $i++ ) {
                echo $word[$i] . "\n";
                $result[$word[$i]]++; //make use of associative arrays to store the count for each alphabet.
        }
        foreach($result as $key => $value)//print each element inside the result array
        {
        print $key . " = " . $value . "<br />";
        }
        ?>
        

        【讨论】:

          【解决方案6】:

          count() 并不是这样工作的,如果要使用 count 函数,则必须显式转换为数组。至于 $table 数组,你有一个额外的维度([])。

          下面的代码应该可以工作(它不是最佳的,但应该让你指向正确的方向。)

          $word = str_split("saapas");
          
          for ( $i = 0; $i < count($word); $i++ ) {
              $table[$word[$i]]++;
          }
          
          foreach ($table as $key => $value) {
              print "$key $value\n";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-06-21
            • 1970-01-01
            • 2013-12-10
            • 1970-01-01
            • 2020-11-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多