使用php将数组转换为自定义格式

时间:2015-03-28 14:23:03

标签: php arrays

我有一个代码,用于计算字符串中字母表的频率。 。我的代码是:

<?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在字符串中重复两次,依此类推。

我的数组格式是否正确?有什么建议吗?谢谢

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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