Подсчет количества букв в слове с помощью PHP - PullRequest
0 голосов
/ 31 октября 2009

Я хочу создать массив из двух столбцов. Вывод должен содержать только существующие буквы в слове с их количеством.

Требуемый вывод следующего кода

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 

Ответы [ 6 ]

3 голосов
/ 31 октября 2009

PHP имеет расширенные функции массива , которые делают большую часть тяжелой работы для этого:

$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);
1 голос
/ 31 октября 2009

Зачем усложнять?

<code>$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 '
';
1 голос
/ 31 октября 2009

Это работает с использованием вашего массива входных символов, но вы действительно хотите построить статический массив для этой задачи?

$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);
0 голосов
/ 31 октября 2009

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";
}
0 голосов
/ 31 октября 2009

попробуйте это. Это метод с одной итерацией, более быстрый и простой!

<?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 />";
}
?>
0 голосов
/ 31 октября 2009
    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 для циклов. Немного неэффективно то, что вы пытаетесь сделать. Один для проверки каждого символа алфавита. Второй цикл - это цикл по строке и подсчет совпадений по алфавиту, в котором включен первый цикл.

Edit: Или вы можете добавить ноль к строке ниже и удалить эхо из цикла. Для которого по-прежнему требуется еще один цикл для отображения этой таблицы.

$table[$word[$i]][0]++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...