2015-03-28 3 views
0

У меня есть код, который будет считать частоту алфавита в строке. , Мой код:Преобразование массива в настраиваемый формат с использованием php

<?php 
    $str = "iamtheone"; 
    $freq_count = array(); 

    for ($i = 0; $i < strlen($str); $i++) { 
     $index = $str[$i]; 
     $freq_count[$index]++; 

     foreach (range('a', 'z') as $char) { 
      //echo "<pre>".$key . " " . $char."</pre>"; 
      $index = $char; 
      if (isset($freq_count[$index])) { 
      } else { 
       $freq_count[$index] = "0"; 
      } 
     } 

    } 

    echo "<pre>"; 
    print_r($freq_count); 
    echo "</pre>"; 
?> 

Выход:

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

Теперь я хочу, чтобы преобразовать массив в этом формате:

  * 
*  *  * *  * * *   * 
a b c d e f g h i j k l m n o p q r s t u v w x y z 

Объяснение: Число звездочек будет зависит от того, сколько будет частоты каждого алфавита. Например, a - это только однократное повторение в строке, e дважды повторяется в строке и так далее.

Является ли мой формат массива верным? Любое предложение? Спасибо

+1

вы можете упростить все существующий код в '$ ул = "Iamtheone"; $ freq_count = array_merge ( array_fill_keys (диапазон ('a', 'z'), 0), array_count_values ​​(str_split ($ str)) ); var_dump ($ freq_count); 'который имеет дополнительное преимущество уже сортироваться по символу –

ответ

0

Ваш учитель не поверит, что ты сделал это без помощи, но:

$str ="iamtheone"; 

// Calculate the frequency table for all letters 
$letters = array_fill_keys(range('a', 'z'), ' '); 
$freq_count = array_merge(
    $letters, 
    array_count_values(str_split(strtolower($str))) 
); 

// Plot the display chart 
for ($line = max($freq_count); $line > 0; --$line) { 
    echo implode(
     ' ', 
     array_map(
      function ($value) use ($line) { 
       return ($value >= $line) ? '*' : ' '; 
      }, 
      $freq_count 
     ) 
    ); 
    echo PHP_EOL; 
} 
echo implode(' ', array_keys($lineArray)), PHP_EOL; 

Demo

+0

Спасибо, много. Этот код для меня новый, и сейчас интересно изучить его. :-) – Mary

0

Вот мой пример, просто добавьте звездочку к каждому обнаруженному символу, нет необходимости подсчитывать количество вхождений как число - также можно использовать strtolower() для преобразования символов верхнего регистра и подсчета их:

$freqCount = array(); 
$countedStr = 'iamtheone'; 

// inits the frequency count array 
foreach (range('a','z') as $char) { 
    $freqCount[$char] = ''; 
} 

for($i=0; $i<strlen($str); $i++) { 
    $index = $countedStr[$i]; 
    // potentially convert to lower case: 
    // $index = strtolower($countedStr[$i]); 
    $freqCount[$index] .= '*'; // adds an asterisk to the letter 
} 
+0

Milen Большое спасибо. , Я попробую этот код прямо сейчас. , – Mary

Смежные вопросы