Menu
Coddy logo textTech

מעבר על מערך באמצעות 'array_walk'

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-PHP של Coddy. שיעור 44 מתוך 68.

הפונקציה array_walk() מציעה גישה שונה לעיבוד מערכים בהשוואה ל־array_map(). בעוד ש־array_map() יוצרת מערך חדש עם ערכים שעברו טרנספורמציה, array_walk() משנה את המערך המקורי ישירות על ידי החלת פונקציית callback על כל איבר במקום.

הפונקציה הזאת שימושית במיוחד כשברצונך לשנות את המערך הקיים בלי ליצור עותק. פונקציית ה־callback שאתה מספק מקבלת כל איבר במערך באמצעות הפניה, וכך מאפשרת לך לשנות ישירות את הערכים המקוריים.

<?php
function addPrefix(&$value, $key) {
    $value = "Item: " . $value;
}

$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items הוא כעת: ["Item: apple", "Item: banana", "Item: orange"]
?>

שימו לב כיצד פונקציית הקריאה החוזרת משתמשת ב־&$value כדי לקבל את איבר המערך באמצעות הפניה. כך הפונקציה יכולה לשנות ישירות את איבר המערך המקורי. הפרמטר השני $key מספק גישה למפתח של האיבר הנוכחי, אף שלא תמיד יש בו צורך עבור טרנספורמציות פשוטות.

array_walk() תומכת גם בארגומנט שלישי אופציונלי שמאפשר להעביר נתונים נוספים ישירות לפונקציית ה־callback שלך. האפשרות הזו שימושית כשהטרנספורמציה שלך תלויה בערך שמוגדר מחוץ למערך, כגון קידומת, סיומת או כל קלט דינמי אחר.

כשמעבירים ארגומנט שלישי אל array_walk(), פונקציית ה־callback שלך מקבלת אותו כפרמטר שלישי:

<?php
function addCategory(&$value, $key, $category) {
    $value = $category . ": " . $value;
}

$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products הוא כעת: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>

כאן, $prefix מועבר כארגומנט השלישי ל-array_walk(), וה-callback מקבל אותו בתור $category. כך אפשר להשתמש שוב באותה פונקציית callback עם קידומות שונות, בלי לקבע בתוכה ערכים.

challenge icon

אתגר

קל

תקבלו שני קלטים: רשימה של שמות מוצרים מופרדים בפסיקים וקידומת של קטגוריה. הקלט הראשון מכיל שמות מוצרים כמחרוזת בפורמט laptop,mouse,keyboard,monitor, והקלט השני הוא טקסט של קידומת קטגוריה (לדוגמה: Electronics).

קראו את שני הקלטים, המירו את שמות המוצרים המופרדים בפסיקים למערך, צרו פונקציית callback שמוסיפה את קידומת הקטגוריה לכל שם מוצר בפורמט "Category: ProductName", השתמשו ב-array_walk() עם פונקציית ה-callback שלכם כדי לשנות ישירות את המערך המקורי, והדפיסו כל שם מוצר ששונה בשורה נפרדת.

פונקציית ה-callback שלכם חייבת להשתמש בפרמטר &$value כדי לשנות רכיבי מערך באמצעות העברה לפי הפניה. הפונקציה צריכה לשרשר את קידומת הקטגוריה עם נקודתיים ורווח, ולאחריהם את שם המוצר.

פורמט הקלט:

  • שורה ראשונה: שמות מוצרים מופרדים בפסיקים (לדוגמה: laptop,mouse,keyboard,monitor)
  • שורה שנייה: טקסט של קידומת קטגוריה (לדוגמה: Electronics)

הפלט הצפוי: כל שם מוצר ששונה יודפס בשורה נפרדת בפורמט Category: ProductName

נסו בעצמכם

<?php
// קראו את שמות המוצרים המופרדים בפסיקים
$products_input = trim(fgets(STDIN));

// קראו את קידומת הקטגוריה
$category = trim(fgets(STDIN));

// המירו את המחרוזת המופרדת בפסיקים למערך
$products = explode(',', $products_input);

// TODO: כתבו את הקוד שלכם למטה
// צרו פונקציית callback שמשנה כל שם מוצר על ידי הוספת קידומת הקטגוריה
// השתמשו ב-array_walk() עם פונקציית ה-callback שלכם כדי לשנות את המערך


// הדפיסו כל שם מוצר ששונה בשורה נפרדת
foreach ($products as $product) {
    echo $product . "\n";
}
?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר PHP אונליין