Menu

מערכים אסוציאטיביים ב-PHP: זוגות מפתח וערך

מערך אסוציאטיבי ב-PHP שומר ערכים תחת מפתחות שאתם נותנים להם שם: $user = ['name' => 'Ada', 'age' => 36]; נקרא כ-$user['name']. למדו איך מוסיפים, משנים ומסירים זוגות, עוברים על מפתחות וערכים, מקבלים את כל המפתחות או הערכים, בודקים מפתח וממיינים לפי מפתח או ערך.

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

מערך אסוציאטיבי שומר כל ערך תחת מפתח שאתם בוחרים, בכתיב key => value: $user = ['name' => 'Ada', 'age' => 36];. קוראים ערך עם $user['name'], ומוסיפים או משנים ערך על ידי הצבה למפתח שלו: $user['email'] = 'ada@example.com';.

בשפות אחרות אותו מבנה נקרא dictionary, map או hash. ב-PHP זה מערך רגיל שהמפתחות שלו הם מחרוזות במקום 0, 1, 2.

הוספה, שינוי והסרה של זוגות

הצבה למפתח שלא קיים מוסיפה אותו בסוף. הצבה למפתח שקיים מחליפה את הערך שלו ושומרת על המיקום שלו. unset() מסירה זוג.

array_push() לא עוזרת כאן: היא יכולה רק להוסיף ערכים עם מפתחות מספריים. כדי להוסיף כמה זוגות בבת אחת, השתמשו ב-array_merge($stock, $more), שבו הערכים החדשים מנצחים, או ב-$stock + $more, שבו מפתחות קיימים שומרים על הערכים שלהם; עמוד array_merge משווה בין השניים.

מעבר על מפתחות וערכים

foreach ($array as $key => $value) עוברת על הזוגות בסדר שבו הם נוספו. השמיטו את $key => כשאתם צריכים רק את הערכים.

קבלת כל המפתחות או כל הערכים

array_keys() מחזירה את המפתחות כרשימה פשוטה ו-array_values() מחזירה את הערכים, שתיהן עם אינדקסים חדשים מ-0. תנו ל-array_keys() ארגומנט שני והיא תחזיר רק את המפתחות שמחזיקים את הערך הזה, וכך מוצאים כל מפתח של ערך.

למפתח אחד, array_search() מחזירה את ההתאמה הראשונה, או false כשאין כזו. עמוד array_search מסביר למה חייבים להשוות את התוצאה הזו עם !== false.

בדיקה אם מפתח קיים

isset($arr['key']) היא הבדיקה הרגילה והמהירה ביותר, אבל היא מחזירה false כשהמפתח קיים ומחזיק null. array_key_exists('key', $arr) מחזירה true במקרה הזה. לקריאה עם ערך חלופי, האופרטור ?? עושה את שניהם בבת אחת.

מיון לפי מפתח או לפי ערך

ksort() ממיינת לפי מפתח ו-asort() ממיינת לפי ערך, ושתיהן שומרות כל מפתח מחובר לערך שלו. krsort() ו-arsort() ממיינות בסדר הפוך. אל תשתמשו ב-sort() על מערך אסוציאטיבי: היא זורקת את המפתחות וממספרת מחדש מ-0.

כולן ממיינות במקום ומחזירות true, ולכן $sorted = ksort($arr) נותן לכם true, לא מערך. לסדר מותאם משתמשים ב-uasort() וב-uksort().

היפוך, ספירה והמרה ל-JSON

כמה שורות בודדות חוזרות שוב ושוב עם נתוני מפתח וערך: array_flip() מחליפה בין מפתחות לערכים, array_count_values() סופרת כמה פעמים מופיע כל ערך, ו-json_encode() הופכת את המערך לאובייקט JSON.

טעות נפוצה: קריאה של מפתח שלא קיים

קריאה של מפתח חסר מחזירה null, אבל ה-PHP שלכם גם מדפיסה אזהרה:

<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3

תנו לקריאה ערך ברירת מחדל עם ??, שאף פעם לא מזהיר, או בדקו קודם עם isset() כשהמקרה החסר צריך ענף משלו.

בתוך מחרוזת במירכאות כפולות, עטפו את הגישה בסוגריים מסולסלים, "{$user['email']}". בלעדיהם, PHP מקבלת רק את הצורה בלי מירכאות "$user[email]", שקל לטעות בה.

שאלות נפוצות

איך יוצרים מערך אסוציאטיבי ב-PHP?

כתבו כל זוג כ-key => value בתוך סוגריים מרובעים: $prices = ['apple' => 1.2, 'pear' => 0.9];. קוראים ערך עם $prices['apple'].

איך ממיינים מערך אסוציאטיבי לפי מפתח ב-PHP?

קראו ל-ksort($arr); לסדר A עד Z או ל-krsort($arr); לסדר Z עד A. שתיהן ממיינות במקום, שומרות כל ערך עם המפתח שלו ומחזירות true, לא את המערך הממוין.

איך עוברים על מערך אסוציאטיבי בלולאה ב-PHP?

השתמשו ב-foreach עם שני המשתנים: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. הזוגות יוצאים בסדר שבו הם נוספו.

איך מקבלים את כל המפתחות של מערך אסוציאטיבי?

array_keys($arr) מחזירה את המפתחות כמערך עם אינדקסים, ו-array_values($arr) מחזירה את הערכים. array_keys($arr, $value) מחזירה רק את המפתחות שהערך שלהם שווה ל-$value.

האם מערך אסוציאטיבי ב-PHP שומר על סדר ההכנסה?

כן. מערכים ב-PHP הם מפות מסודרות, ולכן foreach, print_r ו-json_encode רואים כולם את הזוגות בסדר שבו הכנסתם אותם, עד שממיינים את המערך עם ksort(), asort() או פונקציה דומה.

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

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

להתחיל