Forum und email

מערכים

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

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

תחביר

אפשר לבנות arrayע"י תבנית שפה מיוחדת למערך() . זה דורש מספר מסוים של זוגות מפתח => ערך מופרדים ע"י פסיקים.

array( 
							key => 
						value
     , ...
     )
// מפתח  יכול להיות integer או string
// ערך יכול להיות כל ערך.

<?php
$arr 
= array("foo" => "bar"12 => true);

echo 
$arr["foo"]; // bar
echo $arr[12];    // 1
?>

מפתח יכול להיות או שלם או string. אם הערך של מפתח הוא יצוג סטנדרטי של integer, הוא יפוענח כשלם (לדוגמא "8"יפוענח כ 8, בעוד ש "08" יפוענח כ "08"). ב PHP קיים רק מערך מסוג אחד, ללא קשר לסוג המפתחות שלו.

ערך יכול להיות כל סוג של טיפוס PHP.

<?php
$arr 
= array("somearray" => array(=> 513 => 9"a" => 42));

echo 
$arr["somearray"][6];    // 5
echo $arr["somearray"][13];   // 9
echo $arr["somearray"]["a"];  // 42
?>

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

<?php
// This array is the same as ...
array(=> 433256"b" => 12);

// ...this array
array(=> 43=> 32=> 56"b" => 12);
?>

Warning

החל מ PHP 4.3.0, תהליך יצירת האינדקסים שונה במקצת, במקרה של נתינת ערך ללא מפתח, אם המפתח השלם, בעל הערך הגדול ביותר, הוא שלילי, המפתח החדש ,יקבל את הערך אפס (0). לפני PHP 4.3.0 ,הערך שהתקבל היה שווה למפתח +1.

שימוש ב TRUE בתור מפתח, ישונה למפתח integer 1 . שימוש ב FALSE בתור מפתח, ישונה למפתח integer 0 . שימוש ב NULL ישונה למפתח מסוג מחרוזת ריקה. שאינו מקביל לשימוש בסוגרים מרובעים ריקים.

אתה לא יכול להשתמש במערכים ובעצמים בתור מפתחות, שימוש כזה יחזיר הודעת שגיאה: Illegal offset type.

ייצור/שינוי מערכים בעזרת תחביר סוגריים מרובעים.

אתה יכול לשנות ערך של מערך ע"י השמה של ערכים בתוכו, בצורה מפורשת.

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

$arr[מפתח] = ערך;
$arr[] = ערך;
// המפתח יכול להיות integer או string
// הערךיכול להיות כל ערך שהוא.
אם המערך $arr עוד לא קיים, PHP תיצור אותו, כך שזו דרך אלטרנטיבית להגדיר מערכים, לשנות ערך מסוים במערך, פשוט ציין את המפתח, שאת הערך שלו אתה רוצה לשנות, על מנת להוציא ערך מסוים מהמערך , יש צורך להתשמש בפונקציהunset() כלפיו.
<?php
$arr 
= array(=> 112 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42// This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>

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

<?php
// Create a simple array.
$array = array(12345);
print_r($array);

// Now delete every item, but leave the array itself intact:
foreach ($array as $i => $value) {
    unset(
$array[$i]);
}
print_r($array);

// Append an item (note that the new key is 5, instead of 0 as you
// might expect).
$array[] = 6;
print_r($array);

// Re-index:
$array array_values($array);
$array[] = 7;
print_r($array);
?>

הפלט של הדוגמא יהיה:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

פונקציות יעילות

יש לא מעט פונקציות מועילות לטיפול במערכים. ראה את המדריך על פונקציות של מערכים.

Note: הפוקציה unset() מאפשרת להסיר ערכים מתוך מערך, שים לב, האינדקסים של המערך לא ישונו עם הפעלת הפונקציה, כך שעלולים להיווצר " חורים" בסדר האינדקסים. אם אתה רק משתמש באינדקסים ממוספרים רגילים ( "usual integer indices") ,שמתחילים מאפס וגדלים באחד כל פעם, אתה יכול לסדר את האינדקסים מחדש ע"י שימוש בפונקציה array_values().

<?php
$a 
= array(=> 'one'=> 'two'=> 'three');
unset(
$a[2]);
/* will produce an array that would have been defined as
   $a = array(1 => 'one', 3 => 'three');
   and NOT
   $a = array(1 => 'one', 2 =>'three');
*/

$b array_values($a);
// Now b is array(1 => 'one', 2 =>'three')
?>

מבנה השליטה foreach קיים במיוחד בשביל מערכים. הוא מספק דרך נוחה לנוע בתוך מערך.

עשה ולא תעשה במערכים.

למה שגוי לכתוב$foo[bar] ?

אתה תמיד חייב לכתוב מפתחות מסוג מחרוזת, בתוך גרשיים.למשל כתוב, $foo['bar'] ולא $foo[bar]. אבל למה שגוי לכתוב $foo[bar] ? אולי ראית סקריפטים ישנים שבהם מופיע :

<?php
$foo
[bar] = 'enemy';
echo 
$foo[bar];
// etc
?>
זו שגיאה, אבל זה עובד, אז למה זו שגיאה??, הסיבה שזו שגיאה כי ביש בקוד קבוע לא מוגדר (bar), במקום מחרוזת ('bar' ), ו PHP עלולה בעתיד להגדיר קבוע, בדיוק באותו שם. אז למה זה כן עובד? כי PHP ממירה אוטומטית מחרוזות חשופות (מחרוזות ללא מרכאות, שאין להם שום מובן מסוים) למחרוזת שמכילה את המחרוזת החשופה. לדוגמא אם אין שום קבוע מוגדר עם השם bar, PHP תחליף את המחרוזת ב 'bar'ותשתמש בזה.

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

<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('html_errors'false);
// Simple array:
$array = array(12);
$count count($array);
for (
$i 0$i $count$i++) {
    echo 
"\nChecking $i: \n";
    echo 
"Bad: " $array['$i'] . "\n";
    echo 
"Good: " $array[$i] . "\n";
    echo 
"Bad: {$array['$i']}\n";
    echo 
"Good: {$array[$i]}\n";
}
?>
הפלט של התוכנית יהיה :
Checking 0: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad: 
Good: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad: 
Good: 1

Checking 1: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad: 
Good: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad: 
Good: 2

קוד מסובך יותר לתוכנית הזאת:

<?php
// Let's show all errors
error_reporting(E_ALL);

$arr = array('fruit' => 'apple''veggie' => 'carrot');

// Correct
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Incorrect.  This works but also throws a PHP error of
// level E_NOTICE because of an undefined constant named fruit
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// Let's define a constant to demonstrate what's going on.  We
// will assign value 'veggie' to a constant named fruit.
define('fruit''veggie');

// Notice the difference now
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// The following is okay as it's inside a string.  Constants are not
// looked for within strings so no E_NOTICE error here
print "Hello $arr[fruit]";      // Hello apple

// With one exception, braces surrounding arrays within strings
// allows constants to be looked for
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// This will not work, results in a parse error such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using autoglobals in strings as well
print "Hello $arr['fruit']";
print 
"Hello $_GET['foo']";

// Concatenation is another option
print "Hello " $arr['fruit']; // Hello apple
?>

כאשר אתה מגדיר את ה error_reporting()להראות שגיאות מרמת E_NOTICE (למשל להגדיר אותו בתור E_ALL) אז תקבל את הודעות השגיאה האלה. בברירת המחדל , error_reporting מוגדר ככה שהשגיאות האלה לא יראו.

כמו שצוין בחלק על ה תחביר , חייב להיות ביטוי בתוך הסוגרים המרובעים, ('[' ו ']'). כלומר אתה יכול לכתוב משהו בסגנון של":

<?php
echo $arr[somefunc($bar)];
?>
זו דוגמא לשימוש בפונקציות מחזירות ערך , בתור אינדקס של מערך. PHP מזהה גם קבועים, כמו שיכולת לראות את ה E_* בדוגמא הקודמת.
<?php
$error_descriptions
[E_ERROR]   = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>
שים לב שE_ERROR הוא גם מזהה בר תוקף, בדומה ל bar בדוגמא הראשונה. אבל למעשה הדוגמה האחרונה שוות ערך לכתיבה כזאת:
<?php
$error_descriptions
[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
בגלל ש E_ERROR שווה ל 1, וכו'.

כמו שהסברנו בדוגמא למעלה, $foo[bar] שגוי אבל עובד, כיbar ע"פ התחביר שלו הוא קבוע כלשהו, ומאחר ש PHP לא מוצאת שום קבוע עם השם bar היא מניחה שהכונה ל "bar", ששכחו לכתוב לו את הגרשיים.

אז למה זה רע?

כי בעתיד אולי הצוות של PHP עלול להכריז על קבוע נוסף עם השם הזה, ואז הקוד יהיה בעייתי. לדוגמא, כבר היום אי אפשר להשתמש במילים empty ו default בצורה הזאת , מאחר והם מילות מפתח שמורות.

Note: אפשר לותר על להקיף את המפתח בסוגריים, ע"י שימוש בסוגרים חיצוניים ,כך שאפשר לכתוב "$foo[bar]" . ראה בדוגמא למעלה איך זה אפשרי כמו גם בהסבר על ניתוח משתנים בתוך מחרוזת.

המרת משתנה למערך.

לכל אחד מהטיפוסים:integer, float, string, boolean ו resource, אם אתה ממיר את הערך ל array, אתה מקבל מערך עם אלמנט אחד (עם אינדקס אפס), עם הערך הסקלרי ההתחלתי.

אם אתה ממיר object למערך, אתה מקבל את התכונות (המשתנים החברים בעצם) של העצם, בתור אלמנטים במערך. כשהמפתחות הם שמות המשתנים החברים במחלקה.

בהמרת NULL למערך, אתה מקבל מערך ריק.

דוגמאות

מערך הוא טיפוס עם יכולות רבות ב PHP הנה כמה דוגמאות להמחיש את זה.

<?php
// this
$a = array( 'color' => 'red',
            
'taste' => 'sweet',
            
'shape' => 'round',
            
'name'  => 'apple',
                       
4        // key will be 0
          
);

// is completely equivalent with
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // key will be 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),
// or simply array('a', 'b', 'c')
?>

Example#1 Using array()

<?php
// Array as (property-)map
$map = array( 'version'    => 4,
              
'OS'         => 'Linux',
              
'lang'       => 'english',
              
'short_tags' => true
            
);
            
// strictly numerical keys
$array = array( 7,
                
8,
                
0,
                
156,
                -
10
              
);
// this is the same as array(0 => 7, 1 => 8, ...)

$switching = array(         10// key = 0
                    
5    =>  6,
                    
3    =>  7
                    
'a'  =>  4,
                            
11// key = 6 (maximum of integer-indices was 5)
                    
'8'  =>  2// key = 8 (integer!)
                    
'02' => 77// key = '02'
                    
0    => 12  // the value 10 will be overwritten by 12
                  
);
                  
// empty array
$empty = array();         
?>

Example#2 Collection

<?php
$colors 
= array('red''blue''green''yellow');

foreach (
$colors as $color) {
    echo 
"Do you like $color?\n";
}

/* output:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
*/
?>

שים לב שכרגע , אין אפשרות לשנות ערכים של מערך ,בלולאה מהסוג הזה. כדי לעקוף את זה אפשר לכתוב:

Example#3 Collection

<?php
foreach ($colors as $key => $color) {
    
// won't work:
    //$color = strtoupper($color);
    
    // works:
    
$colors[$key] = strtoupper($color);
}
print_r($colors);

/* output:
Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)
*/
?>

הדוגמא הבאה יוצרת מערך על בסיס 1:

Example#4 One-based index

<?php
$firstquarter  
= array(=> 'January''February''March');
print_r($firstquarter);

/* output:
Array 
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)
*/

Example#5 מילוי מערך

// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle); 
?>

מערכים ממוינים מעיקרם, אשר לשנות את סדר המיון ע"י שימוש בפונקציות מיון מגוונות. ראה פונקציות על מערכים למידע נוסף, אתה יכול לספור את מספר האיברים במערך ע"י שימוש בפונקציה count() .

Example#6 מיון מערך

<?php
sort
($files);
print_r($files);
?>

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

Example#7 מערכים רקורסביים ורבי מימדים.

<?php
$fruits 
= array ( "fruits"  => array ( "a" => "orange",
                                       
"b" => "banana",
                                       
"c" => "apple"
                                     
),
                  
"numbers" => array ( 1,
                                       
2,
                                       
3,
                                       
4,
                                       
5,
                                       
6,
                                     ),
                  
"holes"   => array (      "first",
                                       
=> "second",
                                            
"third"
                                     
)
                );

// Some examples to address values in the array above 
echo $fruits["holes"][5];    // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]);  // remove "first"

// Create a new multi-dimensional array
$juices["apple"]["green"] = "good"
?>

אתה צריך להיות מודע, שהשמה של מערכים תמיד נעשית ע"י העתקה של ערכים. על מנת לקבל את המערך ע"י ההכוון שלו (by reference) יש צורך להשתמש באופרטור ההכוון.

<?php
$arr1 
= array(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 is changed,
             // $arr1 is still array(2, 3)
             
$arr3 = &$arr1;
$arr3[] = 4// now $arr1 and $arr3 are the same
?>