จากข้อความ ฉันจะนับความหนาแน่น/จำนวนความยาวของคำได้อย่างไร เพื่อจะได้ผลลัพธ์เช่นนี้
- 1 ตัวอักษร : 52 / 1%
- 2 ตัวอักษร : 34 / 0.5%
- ตัวอักษร 3 คำ : 67 / 2%
พบสิ่งนี้ แต่สำหรับหลาม
จากข้อความ ฉันจะนับความหนาแน่น/จำนวนความยาวของคำได้อย่างไร เพื่อจะได้ผลลัพธ์เช่นนี้
พบสิ่งนี้ แต่สำหรับหลาม
คุณสามารถเริ่มต้นด้วยการแบ่งข้อความของคุณเป็นคำ โดยใช้ explode()
(เป็นวิธีแก้ปัญหาที่ง่าย/เกินไป) หรือ preg_split()
< em>(อนุญาตให้ใช้สิ่งที่ทรงพลังกว่านี้เล็กน้อย) :
$text = "this is some kind of text with several words";
$words = explode(' ', $text);
จากนั้น วนซ้ำคำต่างๆ เพื่อให้ได้ความยาวสำหรับแต่ละคำ โดยใช้ strlen()
< /แข็งแกร่ง> ; และใส่ความยาวเหล่านั้นลงในอาร์เรย์:
$results = array();
foreach ($words as $word) {
$length = strlen($word);
if (isset($results[$length])) {
$results[$length]++;
}
else {
$results[$length] = 1;
}
}
หากคุณกำลังทำงานกับ UTF-8 โปรดดูที่ mb_strlen()
ในตอนท้ายของวงนั้น $results
จะมีลักษณะเช่นนี้:
array
4 => int 5
2 => int 2
7 => int 1
5 => int 1
จำนวนคำทั้งหมดที่คุณต้องใช้ในการคำนวณเปอร์เซ็นต์ สามารถพบได้:
foreach
array_sum()
บน $results
หลังจากที่วนซ้ำเสร็จสิ้นส่วนการคำนวณเปอร์เซ็นต์ มันก็เป็นคณิตศาสตร์นิดหน่อย -- คงไม่ช่วยอะไรขนาดนั้นนะครับ ^^
คุณสามารถกระจายข้อความด้วยการเว้นวรรค จากนั้นนับจำนวนตัวอักษรสำหรับแต่ละคำที่ได้ หากมีเครื่องหมายวรรคตอนหรือตัวแยกคำอื่น ๆ คุณต้องคำนึงถึงเรื่องนี้ด้วย
$lettercount = array();
$text = "lorem ipsum dolor sit amet";
foreach (explode(' ', $text) as $word)
{
@$lettercount[strlen($word)]++; // @ for avoiding E_NOTICE on first addition
}
foreach ($lettercount as $numletters => $numwords)
{
echo "$numletters letters: $numwords<br />\n";
}
PS: ฉันยังไม่ได้พิสูจน์สิ่งนี้ แต่ควรจะได้ผล
คุณสามารถฉลาดขึ้นในการลบเครื่องหมายวรรคตอนได้โดยใช้ preg_replace
$txt = "Sean Hoare, who was first named News of the World journalist to make hacking allegations, found dead at Watford home. His death is not being treated as suspiciou";
$txt = str_replace( " ", " ", $txt );
$txt = str_replace( ".", "", $txt );
$txt = str_replace( ",", "", $txt );
$a = explode( " ", $txt );
$cnt = array();
foreach ( $a as $b )
{
if ( isset( $cnt[strlen($b)] ) )
$cnt[strlen($b)] += 1;
else
$cnt[strlen($b)] = 1;
}
foreach ( $cnt as $k => $v )
{
echo $k . " letter words: " . $v . " " . round( ( $v * 100 ) / count( $a ) ) . "%\n";
}