הרשם שאלות ותשובות רשימת חברים לוח שנה הודעות מהיום

חזור   הוסטס - פורום אחסון האתרים הגדול בישראל > עיצוב גראפי, תכנות על כל שפותיו וקידום ושיווק אתרים > פורום תיכנות

   
|!|

השב
 
כלים לאשכול תצורת הצגה
ישן 26-08-08, 14:52   # 1
oryrm19
חבר בקהילה
 
oryrm19's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2006
מיקום: ראשון לציון
הודעות: 230
שלח הודעה באמצעות ICO אל oryrm19 שלח הודעה באמצעות MSN אל oryrm19

oryrm19 לא מחובר  

חיתוך ע"פ מספר מילים [PHP]

יש לי פסקה עם X מילים, ואני רוצה לחתוך ולקבל רק את הY מילים הראשונות.
איזו פונקציה עושה זאת?

תודה מראש.
  Reply With Quote
ישן 26-08-08, 15:23   # 2
Daniel
אחראי פורום
 
מיני פרופיל
תאריך הצטרפות: Mar 2007
הודעות: 2,875

Daniel לא מחובר  

מה שאני חושב עליו הוא explode ו-array_split
  Reply With Quote
ישן 26-08-08, 22:47   # 3
Kfir.G
חבר וותיק
 
Kfir.G's Avatar
 
מיני פרופיל
תאריך הצטרפות: Dec 2005
הודעות: 1,059
שלח הודעה באמצעות ICO אל Kfir.G

Kfir.G לא מחובר  

למה שתרצה לעשות את זה דניאל?
אתה מכניס את המילים המבוקשות למחזרות וסופר את מספר המופע של התו ' ' וברגע שאתה מגיע למספר המבוקש אתה משתמש במיקום בשביל substr, מחזיר את המחרוזת החדשה וגמרנו.
בשביל מה ליצור מערך כאן?
__________________
פיג'מה
משחקים
  Reply With Quote
ישן 26-08-08, 23:21   # 4
Daniel
אחראי פורום
 
מיני פרופיל
תאריך הצטרפות: Mar 2007
הודעות: 2,875

Daniel לא מחובר  

אתה מדבר על strpos, ו-strpos מקבל רק offSet - לא $count/$limit/$start
  Reply With Quote
ישן 27-08-08, 00:53   # 5
Kfir.G
חבר וותיק
 
Kfir.G's Avatar
 
מיני פרופיל
תאריך הצטרפות: Dec 2005
הודעות: 1,059
שלח הודעה באמצעות ICO אל Kfir.G

Kfir.G לא מחובר  

למה צריך פונקציה מוכנה בשביל זה?

PHP קוד:
function getWords ($str$num$separator ' ') {
    
$count 0;
    
$len strlen($str);
    
$i 0;
    for(; 
$i $len && $count $num$i++) {
        if(
$str[$i] == $separator)
            
$count++;
    }
    return 
substr($str,0,$i);

__________________
פיג'מה
משחקים
  Reply With Quote
ישן 27-08-08, 10:00   # 6
Daniel
אחראי פורום
 
מיני פרופיל
תאריך הצטרפות: Mar 2007
הודעות: 2,875

Daniel לא מחובר  

ציטוט:
נכתב במקור על ידי Kfir.G צפה בהודעה
למה צריך פונקציה מוכנה בשביל זה?

PHP קוד:
function getWords ($str$num$separator ' ') {
    
$count 0;
    
$len strlen($str);
    
$i 0;
    for(; 
$i $len && $count $num$i++) {
        if(
$str[$i] == $separator)
            
$count++;
    }
    return 
substr($str,0,$i);

כי הפיתרון שהבאת איטי... הוא לוקח פי 2 זמן בבדיקה שביצעתי...
קוד:
0.60995697975159 seconds for getWords1($str, 5)
1.2931590080261 seconds for getWords2($str, 5)
PHP קוד:
<?php
ini_set
("max_execution_time"100);
$str "While I was walking under the BIG brown tree I saw a cat";
function 
getWords1($str$num$seperator ' ')
{
    return 
implode($seperatorarray_slice(explode($seperator$str), 0$num));
}


function 
getWords2 ($str$num$separator ' ')
{
    
$count 0;
    
$len strlen($str);
    
$i 0;
    for(; 
$i $len && $count $num$i++) {
        if (
$str[$i] == $separator)
            
$count++;
    }
    return 
substr($str0$i);
}

$max 100000;

$start microtime(true);
$i 0;
while (
$i $max) {
    
getWords1($str5);
    
$i++;
}
$end microtime(true);

echo (
$end $start) . " seconds for getWords1(\$str, 5)<br />";

sleep(5); //Just in case

$start microtime(true);
$i 0;
while (
$i $max) {
    
getWords2($str5);
    
$i++;
}
$end microtime(true);

echo (
$end $start) . " seconds for getWords2(\$str, 5)<br />";

?>
  Reply With Quote
ישן 27-08-08, 10:48   # 7
Kfir.G
חבר וותיק
 
Kfir.G's Avatar
 
מיני פרופיל
תאריך הצטרפות: Dec 2005
הודעות: 1,059
שלח הודעה באמצעות ICO אל Kfir.G

Kfir.G לא מחובר  

אני חייב לציין שהתוצאות שהצגת הפתיעו אותי.
אבל אתה חייב להבין שהשיטה שלי לוגית יעילה יותר. למה? בשיטה שלך עוברים על כל המחרוזת וכשמוצאים את המפריד מפרקים למערך. מסיבה שאני באמת צריך לברר כשמדובר במחרוזות קטנות השיטה שלך מהירה יותר אבל תיקח מחרוזות קצת יותר ארוכות
PHP קוד:
$str "While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat While I was walking under the BIG brown tree I saw a cat"

והתוצאה

קוד:
3.50309419632 seconds for getWords1($str, 5)
1.6103219986 seconds for getWords2($str, 5)
האמת שנורא מעניין אותי למה השיטה שלך יעילה יותר במחרוזות קצרות כי מבחינה לוגית זה לא מסתדר לי =\ יש לך מושג למה זה קורה?
__________________
פיג'מה
משחקים
  Reply With Quote
ישן 27-08-08, 11:34   # 8
Jerba
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Jun 2007
הודעות: 300

Jerba לא מחובר  

ציטוט:
<?php
$string = "aBBBaCCCADDDaEEEaGGGA";
$chunks = spliti ("a", $string, 5);
print_r($chunks);
?>

הכי פשוט בעולם, אתה מקבל מערך שכל איבר ממנו זה חלק מהמחרוזת שנחתך לפי התו שסימנת..(a)
כשאתה תרצה לחתוך לפני מילים , תעשה שהסימון יהיה לפי (רווח) וזהו, זה יביא לך בכל איבר
במערך מילה ואחריה את המילה הבאה
  Reply With Quote
ישן 27-08-08, 12:07   # 9
Daniel
אחראי פורום
 
מיני פרופיל
תאריך הצטרפות: Mar 2007
הודעות: 2,875

Daniel לא מחובר  

ואוו, צודק, שכחתי בכלל לבדוק במחרוזת ארוכה, הממ, גם לי זה מוזר - הייתי מצפה שבמחרוזת ארוכה, דווקא השיטה שלי תיהיה מהירה יותר ושלך איטית יותר - הרי אתה עובר על כל תו בטקסט..

שים לב שהפונקציה שלך איטית יותר ככל שצריך לחתוך יותר מילים(=יותר טקסט לעבור).... הממ, טוב, חוץ משיפור קטן שאפשר לעשות בפונקציה שלך(לפי דעתי להפוך את ה-for ל-do_while, ואת ה-$count++ אל ++$count(כאשר ה-++ לפני המשתנה), גם כדאי לך להפוך את ה-$count < $num וה-$i < $len (להפוך את המיקום שלהם) כי רוב הסיכויים שהעניין של $count יחזיר FALSE לפני $i.

עכשיו, במקום $len אתה יכול להשתמש ב-isset.

טיפה עבדתי על זה - עדיין יש כמה נקודות לשיפור, אבל,
PHP קוד:
function getWords ($str$num$separator ' '$validation true)
{
    if (
$validation) {
        if (! 
is_int($num)) {
            
trigger_error('function: getWords(). $num is not an integer.'E_USER_ERROR);
            return 
false;
        }
        if (!
is_string($str)) {
            
trigger_error('function: getWords(). $str is not a string.'E_USER_ERROR);
            return 
false;
        }
        if (!
is_string($separator)) {
            
trigger_error('function: getWords(). $separator is not a string.'E_USER_ERROR);
            return 
false;
        }
    }
    
$count 0;

    
$i 0;
    do {
        if (
$str[$i] == $separator)
            ++
$count;
        ++
$i;
    } while (isset(
$str[$i]) && $count $num);
    return 
substr($str0$i);

מבוססת על הרעיון שלך.

הכנתי עוד פונקציה שמשתמשת בעיקרון ה-offSet של strpos
PHP קוד:
function getWordsb ($str$num$separator ' '$validation true)
{
    if (!
is_bool($validation)) {
        
trigger_error('function: getWords(). $validation is not a boolean.'E_USER_ERROR);
        return 
false;
    }
    if (
$validation) {
        if (! 
is_int($num)) {
            
trigger_error('function: getWords(). $num is not an integer.'E_USER_ERROR);
            return 
false;
        }
        if (!
is_string($str)) {
            
trigger_error('function: getWords(). $str is not a string.'E_USER_ERROR);
            return 
false;
        }
        if (!
is_string($separator)) {
            
trigger_error('function: getWords(). $separator is not a string.'E_USER_ERROR);
            return 
false;
        }
    }
    
$count 0;

    
$offset 0;
    while ((
$offset strpos($str$separator$offset)) !== false && $count $num) {
        if (
$str[$offset] == $separator)
            ++
$count;
    }
    return 
substr($str0$offset);

אבל גם היא, לא מהירה יותר יחסית לפונקציה שציינתי מעל.
  Reply With Quote
ישן 27-08-08, 12:24   # 10
Kfir.G
חבר וותיק
 
Kfir.G's Avatar
 
מיני פרופיל
תאריך הצטרפות: Dec 2005
הודעות: 1,059
שלח הודעה באמצעות ICO אל Kfir.G

Kfir.G לא מחובר  

ציטוט:
נכתב במקור על ידי MasterT צפה בהודעה
ואוו, צודק, שכחתי בכלל לבדוק במחרוזת ארוכה, הממ, גם לי זה מוזר - הייתי מצפה שבמחרוזת ארוכה, דווקא השיטה שלי תיהיה מהירה יותר ושלך איטית יותר - הרי אתה עובר על כל תו בטקסט..
בדיוק זאת הסיבה שהשיטה שלי מהירה יותר. אני לא עובר על כל תו בטקסט ואתה כן פשוט בגלל שexplode עובר על כל המחרוזת ומפצל אותה לפי המפריד ובשיטה שלי אתה סופר את המפריד. ככה שמה שמשתנה ממחרוזת ארוכה וקצרה אצלי זה strlen וsubstr.

בקשר לפונקציות שלך אני כבר אסתכל ואני אערוך
עלה לי עוד רעיון בהשראתך איך לשפר את הפונקציה שכתבתי קודם

עריכה:
טוב הפעם החלטתי לקחת מחרוזת ארוכה יותר ובגלל שלא רציתי להפריע לביצועים של המחשב שלי הרצתי את זה על שרת חלש יותר מהמחשב שלי ולכן התוצאות הן כאלה :P
לקחתי את הפוקנציה שלך וחשבתי לעצמי שהגורם המעכב המפריע ביותר כאן הוא הsubstr אז הורדתי אותו ואכן היעילות השתפרה פלאים
הפונקציות
PHP קוד:
function getWords1($str$num$seperator ' ')
{
    
$count 0;
    
$i 0;
    do {
        if (
$str[$i] == $separator)
            ++
$count;
        ++
$i;
    } while (isset(
$str[$i]) && $count $num);
    return 
substr($str0$i);
}


function 
getWords2 ($str$num$separator ' ')
{
    
$count 0;
    
$i 0;
    
$nstr "";
    do {
        if (
$str[$i] == $separator) {
            ++
$count;
            
$nstr .= $str[$i];
        }
        ++
$i;
    } while (isset(
$str[$i]) && $count $num);
    return 
$nstr;

התוצאות
PHP קוד:
71.2109460831 seconds for getWords1($str5)
1.75991106033 seconds for getWords2($str5

התוצאה ברורה ולכן גם המסקנה כזאת (). substr עוברת על כל המחרוזת בסוף ואילו בשיטה השנייה אנחנו עוברים רק על התווים הנדרשים מה שאומר שהפונקציה השניה נעצרת אחרי שמשיגים את התוצאה המבוקשת והשניה עוברת על המחרוזת שלנו עד הסוף.

אם למישהו יש חשק להסתכל בקוד מקור של PHP ולספר לי מה בדיוק קורה שם עם substr אני אשמח לשמוע :P
__________________
פיג'מה
משחקים

Last edited by Kfir.G; 27-08-08 at 12:36..
  Reply With Quote
השב

חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים)
 


חוקי פירסום
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is מופעל
סמיילים הם מופעל
[IMG] קוד מופעל
קוד HTML מכובה

קפיצה לפורום


כל הזמנים הם GMT +2. הזמן כעת הוא 19:42.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ