PHP Word ความยาวความหนาแน่น / นับการคำนวณสำหรับสตริง

จากข้อความ ฉันจะนับความหนาแน่น/จำนวนความยาวของคำได้อย่างไร เพื่อจะได้ผลลัพธ์เช่นนี้

  • 1 ตัวอักษร : 52 / 1%
  • 2 ตัวอักษร : 34 / 0.5%
  • ตัวอักษร 3 คำ : 67 / 2%

พบสิ่งนี้ แต่สำหรับหลาม


person giorgio79    schedule 18.07.2011    source แหล่งที่มา


คำตอบ (3)


คุณสามารถเริ่มต้นด้วยการแบ่งข้อความของคุณเป็นคำ โดยใช้ 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 หลังจากที่วนซ้ำเสร็จสิ้น

ส่วนการคำนวณเปอร์เซ็นต์ มันก็เป็นคณิตศาสตร์นิดหน่อย -- คงไม่ช่วยอะไรขนาดนั้นนะครับ ^^

person Pascal MARTIN    schedule 18.07.2011
comment
เร็วเกินไป :( - เพื่อที่จะเพิ่มสิ่งนี้ ก่อนที่จะระเบิดข้อความ จะเป็นการดีที่สุดที่จะ str_replace เครื่องหมายวรรคตอนทั้งหมดโดยไม่มีอะไรเลย เพราะถ้าคุณมีบางอย่างเช่น: Java ก็โอเค แต่ PHP นั้นดีที่สุด - ดีที่สุด = 5 ตัวอักษร เมื่อจริง ๆ แล้วเป็น 4 :) - person hex4; 18.07.2011
comment
@hex4 จริง ; หรือเขาสามารถกรองคำ (และอักขระ) ที่จุดเริ่มต้นของวง foreach ก่อนที่จะได้ความยาวของคำ - person Pascal MARTIN; 18.07.2011

คุณสามารถกระจายข้อความด้วยการเว้นวรรค จากนั้นนับจำนวนตัวอักษรสำหรับแต่ละคำที่ได้ หากมีเครื่องหมายวรรคตอนหรือตัวแยกคำอื่น ๆ คุณต้องคำนึงถึงเรื่องนี้ด้วย

$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: ฉันยังไม่ได้พิสูจน์สิ่งนี้ แต่ควรจะได้ผล

person Carlos Campderrós    schedule 18.07.2011

คุณสามารถฉลาดขึ้นในการลบเครื่องหมายวรรคตอนได้โดยใช้ 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";
}
person Steve Claridge    schedule 18.07.2011