Menu

explode() ב-PHP: פיצול מחרוזת למערך

explode(',', $string) מפצלת מחרוזת בכל פסיק ומחזירה את החלקים כמערך. למדו את פרמטר ה-limit, פיצול לפי ירידת שורה, trim לחלקים, ומתי str_split או preg_split הן הכלי הטוב יותר.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

explode($separator, $string) מפצלת מחרוזת בכל מופע של $separator ומחזירה את החלקים כמערך. explode(',', 'apple,banana,cherry') נותנת ['apple', 'banana', 'cherry'].

המפריד יכול להיות כל מחרוזת, לא רק תו אחד: explode(' and ', 'tea and milk and sugar') עובדת באותה צורה. הפעולה ההפוכה, חיבור מערך בחזרה למחרוזת, היא implode().

תחביר וערך החזרה

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

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

הגבלת מספר החלקים

הארגומנט השלישי, $limit, משנה כמה חלקים מקבלים:

  • limit חיובי מחזיר לכל היותר את מספר החלקים הזה. החלק האחרון מחזיק את שארית המחרוזת, כולל המפרידים.
  • limit שלילי מחזיר כל חלק חוץ מ-abs($limit) האחרונים.
  • limit של 0 מטופל כמו 1.

limit חיובי הוא הכלי הנכון כשרק המפריד הראשון חשוב, למשל שורת key=value שבה גם הערך עשוי להכיל =: explode('=', 'query=a=b', 2) נותנת ['query', 'a=b']. הסעיפים הבאים משתמשים בו כך.

כדי לקבל רק את החלק האחרון, שמרו קודם את המערך במשתנה: $parts = explode('/', $path); $file = end($parts);. כתיבה של end(explode('/', $path)) עדיין מחזירה את הערך הנכון, אבל PHP מדפיסה Notice: Only variables should be passed by reference, כי end() מקבלת את הארגומנט שלה לפי הפניה.

פיצול מחרוזת לפי ירידת שורה

explode("\n", $text) מפצלת בירידות שורה. השתמשו במירכאות כפולות: בגרשיים בודדים '\n' הוא לוכסן הפוך ואחריו האות n, לא ירידת שורה. טקסט מקובצי Windows או מטפסי HTML מסיים לעיתים קרובות שורות ב-"\r\n", וזה משאיר "\r" תועה בסוף כל חלק. preg_split('/\R/', $text) מפצלת בכל סוג של ירידת שורה.

trim לחלקים והשמטת חלקים ריקים

קלט משתמש כמו "red, green , ,blue" מכיל רווחים סביב הפריטים ופריט ריק באמצע. העבירו את החלקים דרך trim() עם array_map(), ואז הסירו מחרוזות ריקות עם array_filter(). array_values() ממספרת את המפתחות מחדש אחר כך, כי array_filter() שומרת על המקוריים.

ה-callback fn($c) => $c !== '' שומר על המחרוזת "0". array_filter($colors) בלי callback הייתה משמיטה אותה, כי "0" שקרית.

הפיכת מחרוזת למערך אסוציאטיבי

הגדרות, עוגיות ומחרוזות דמויות שאילתה נשמרות לעיתים קרובות כזוגות key=value. הפעילו explode פעמיים: פעם אחת לזוגות, ופעם לכל זוג עם limit של 2, תוך פירוק שני החלקים למשתנים (פירוק מערכים).

זוג בלי =, כמו debug, נותן מערך עם איבר אחד, והפירוק מדפיס Warning: Undefined array key 1. רפדו את התוצאה לשני איברים כדי להימנע מזה: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.

למחרוזת שאילתה אמיתית של URL, parse_str() עושה את זה בשבילכם וגם מפענחת %20 ו-+.

פיצול לפי כמה מפרידים

explode() מקבלת מפריד אחד. כדי לפצל בפסיקים, בנקודה פסיק או ברווחים, השתמשו ב-preg_split() עם מחלקת תווים. PREG_SPLIT_NO_EMPTY משמיט את החלקים הריקים ששני מפרידים ברצף היו יוצרים.

יפנית וטקסט UTF-8 אחר

explode() משווה בתים, וב-UTF-8 תו שלם אף פעם לא מופיע בתוך הבתים של תו אחר, ולכן פיצול טקסט יפני במפריד יפני כמו 、 או פסיק ברוחב מלא עובד נכון.

explode מול str_split מול preg_split

פונקציהמפצלת בדוגמהתוצאה
explode()מחרוזת מפריד קבועהexplode('-', '2026-03-14')['2026', '03', '14']
str_split()כל N בתיםstr_split('abcdef', 2)['ab', 'cd', 'ef']
mb_str_split()כל N תוויםmb_str_split('日本語')['日', '本', '語']
preg_split()ביטוי רגולריpreg_split('/\s+/', 'a b')['a', 'b']

explode() לא עושה שום עבודת regex, ולכן היא מהירה יותר מ-preg_split() והיא הבחירה בכל פעם שהמפריד הוא מחרוזת קבועה.

טעות נפוצה: מפריד ריק

מפריד ריק הוא שגיאה. מאז PHP 8.0 explode('', 'abc') זורקת ValueError במקום להחזיר false, והסקריפט נעצר:

PHP Fatal error:  Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3

כדי לפצל מחרוזת לתווים, השתמשו ב-str_split('abc') לטקסט ASCII או ב-mb_str_split($s) לכל דבר שעשוי להכיל תווים מרובי בתים.

שאלות נפוצות

מה explode() עושה ב-PHP?

היא מפצלת מחרוזת בכל מופע של מפריד ומחזירה את החלקים כמערך: explode(',', 'a,b,c') מחזירה ['a', 'b', 'c']. המפריד עצמו לא נכלל באף חלק.

מה explode() מחזירה אם המפריד לא נמצא?

מערך עם איבר אחד, המחרוזת כולה: explode(',', 'apple') מחזירה ['apple']. מחרוזת ריקה נותנת [''], מערך עם מחרוזת ריקה אחת, ולכן count() מחזירה 1, לא 0.

איך מפצלים מחרוזת לפי כמה מפרידים ב-PHP?

השתמשו ב-preg_split() עם מחלקת תווים: preg_split('/[,;|]/', $s) מפצלת בפסיקים, בנקודה פסיק ובקווים אנכיים. כדי להשמיט גם חלקים ריקים, העבירו limit של -1 ואת הדגל: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).

מה ההבדל בין explode() ל-str_split()?

explode() מפצלת במפריד שאתם בוחרים. str_split($s, 3) חותכת את המחרוזת לנתחים באורך קבוע, שנספר בבתים. לטקסט ביפנית או לטקסט מרובה בתים אחר השתמשו ב-mb_str_split($s), שסופרת תווים.

למה explode() זורקת ValueError?

כי המפריד הוא מחרוזת ריקה. מאז PHP 8.0, explode('', $s) זורקת ValueError: explode(): Argument #1 ($separator) cannot be empty. כדי לפצל מחרוזת לתווים בודדים השתמשו ב-str_split() או ב-mb_str_split().

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל