我想创建一个有两列的数组。输出应仅包含单词中现有的字母及其金额。
以下代码的所需输出
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
答案 0 :(得分:3)
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);
答案 1 :(得分:1)
这可以使用你的输入字符数组,但你真的想为这个任务构建一个静态数组吗?
$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);
答案 2 :(得分:1)
为何复杂化?
$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>';
答案 3 :(得分:0)
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]++;
答案 4 :(得分:0)
试试这个。它是一个单一的迭代方法,更快更简单!
<?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 />";
}
?>
答案 5 :(得分:0)
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";
}