اذهب إلى المحتوى

المصفوفات (Arrays) في PHP


سارة محمد2

المصفوفة (array) هي بنية بيانات تخزّن عدة قيم في قيمة واحدة، وهي خريطة مرتبة تربط بين القيم والمفاتيح. تُنشَأ مصفوفة مباشرة عبر الأقواس المعقوفة [] أو عبر الدالة Array()‎ التي تأخذ المعاملات التالية:

المعامل التفاصيل
key (المفتاح) المفتاح هو المعرّف الفريد وفهرس المصفوفة. من الممكن أن يكون سلسلة نصية أو عدد صحيح مثل ‎'foo'‎، '5'، 10، 'a2b'‎
value (القيمة) ‏يوجد لكل مفتاح قيمة مقابلة (وإلا تكون null ويمكن أن تكون القيمة من أي نوع‎، وستظهر رسالة خطأ إذا حاولت الوصول إليه)‏ 

تهيئة مصفوفة

يمكن أن نُهيأ مصفوفة فارغة عبر الدالة Array()‎ أو الأقواس [] مباشرةً:

// مصفوفة فارغة
$foo = array();

// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار
$foo = [];

ويمكن أن نُهيأ مصفوفة ونعطيها قيم في نفس الوقت:

// إنشاء مصفوفة بسيطة من 3 سلاسل نصية
$fruit = array('apples', 'pears', 'oranges');

// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار
$fruit = ['apples', 'pears', 'oranges'];

ويمكن أيضًا أن نهيأ مصفوفة مع فهارس مخصصة (تسمى مصفوفة ترابطية associative array):

// مصفوفة ترابطية بسيطة
$fruit = array(
    'first' => 'apples',
    'second' => 'pears',
    'third' => 'oranges'
);

// يمكن أن نضبط القيمة والمفتاح كالتالي
$fruit['first'] = 'apples';

// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار
$fruit = [
    'first' => 'apples',
    'second' => 'pears',
    'third' => 'oranges'
];

ستنشئ PHP المتغير تلقائيًا إذا لم يكن قد اُستخدم سابقًا، وهذا يجعل الشيفرة ملائمة لكنها صعبة القراءة:

$foo[] = 1; // Array( [0] => 1 )
$bar[][] = 2; // Array( [0] => Array( [0] => 2 ) )

تتابع PHP الفهرسة من حيث توقفت وتستخدم سلاسل نصية عددية كأعداد صحيحة للفهرسة:

$foo = [2 => 'apple', 'melon']; // Array( [2] => apple, [3] => melon )

$foo = ['2' => 'apple', 'melon']; // نفس المصفوفة السابقة

$foo = [2 => 'apple', 'this is index 3 temporarily', '3' => 'melon'];
// نفس المصفوفة السابقة، سيقوم العنصر الأخير بالكتابة فوق العنصر الثاني

يمكنك استخدام الصنف splfixedarray لتهيئة المصفوفة بحجم ثابت:

$array = new SplFixedArray(3);
$array[0] = 1;
$array[1] = 2;
$array[2] = 3;
$array[3] = 4; // RuntimeException

// زيادة حجم المصفوفة إلى 10
$array->setSize(10);

ملاحظة: المصفوفة المنشأة باستخدام الصف SplFixedArray لها مساحة ذاكرة منخفضة لمجموعات كبيرة من البيانات، ولكن يجب أن تكون المفاتيح أعدادًا صحيحة.

لتهيئة مصفوفة بحجم ديناميكي وبعدة عناصر غير فارغة يمكنك استخدام حلقة كالتالي:

$myArray = array();
$sizeOfMyArray = 5;
$fill = 'placeholder';
for ($i = 0; $i < $sizeOfMyArray; $i++) {
    $myArray[] = $fill;
}

print_r($myArray);
// Array ( [0] => placeholder [1] => placeholder [2] => placeholder [3] => placeholder [4] => placeholder )

يمكنك استخدام الدالة array_fill()‎ لإنشاء مصفوفة وإعطاء مفاتيحها نفس القيم.

array array_fill ( int $start_index , int $num , mixed $value )

تنشأ التعليمة السابقة وتُرجع مصفوفة فيها العدد num من العناصر التي قيمتها value بدءًا من الفهرس start_index، وإذا كانت قيمة start_index سالبة فستبدأ المصفوفة بفهرس سالب ثم تبدأ قيم الفهارس التالية من الصفر.

$a = array_fill(5, 6, 'banana');
// Array ( [5] => banana, [6] => banana, ..., [10] => banana)

$b = array_fill(-2, 4, 'pear'); 
// Array ( [-2] => pear, [0] => pear, ..., [2] => pear)

نتيجة: عندما تستخدم الدالة array_fill()‎ تكون أكثر محدودية فيما تودّ فعله أما الحلقة فهي أكثر مرونة وتتيح لك الكثير من الخيارات.

إذا أردت ملء المصفوفة بمجال أرقام (من 0 إلى 4 مثلًا) يمكنك إما إضافة كل عنصر بشكلٍ مفرد أو استخدام الدالة range()‎:

array range ( mixed $start , mixed $end [, number $step = 1 ] )

تنشأ هذه الدالة مصفوفة تحوي مجال من العناصر، وفيها المعاملان الأول والثاني إلزاميان إذ يحددان بداية ونهاية المجال أما المعامل الثالث فهو خياري ويحدد مقدار زيادة العناصر في المجال. مثال: إنشاء مجال من 0 إلى 4 بمقدار زيادة 1 ستكون نتيجته مصفوفة عناصرها: 0، 1، 2، 3، 4 أما إذا كان مقدار الزيادة 2 فستكون عناصر المصفوفة 0، 2، 4.

$array = [];
$array_with_range = range(1, 4);
for ($i = 1; $i <= 4; $i++) {
    $array[] = $i;
}

print_r($array); 
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

print_r($array_with_range); 
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

تعمل الدالة range بشكلٍ صحيح مع الأعداد الصحيحة والعشرية والمنطقية (التي حُوّلت إلى أعداد صحيحة) والسلاسل النصية، ولكن يجب أخذ الحذر عند استخدام الأعداد العشرية كوسيط بسبب مشكلة دقة الفاصلة العائمة.

التحقق من وجود مفتاح

يمكنك استخدام الدالة array_key_exists()‎ أو isset()‎ أو ‎!empty()‎ للتحقق من وجود مفتاح:

$map = [
    'foo' => 1,
    'bar' => null,
    'foobar' => '',
];

array_key_exists('foo', $map); // true
isset($map['foo']); // true
!empty($map['foo']); // true
array_key_exists('bar', $map); // true
isset($map['bar']); // false
!empty($map['bar']); // false

لاحظ أن الدالة isset()‎ تعامل العنصر الذي قيمته null على أنّه غير موجود، وتعامل ‎!empty()‎ بالمثل أي عنصر قيمته false (استخدام موازنة ضعيفة مثل null، السلسلة الفارغة ' '، ‏0 تعاملها كلها على أنها false)، أي أن نتيجة isset($map['foobar'])‎ هي true أما نتيجة ‎!empty($map['foobar'])‎ هي false، يمكن أن يؤدي هذا إلى مشاكل (فمن الممكن أن تنسى مثلًا أنّ السلسلة النصية '0' تُعامَل على أنّها false) لذا فإنّ استخدام ‎!empty()‎ يمكن أن يكون غير مقبول.

لاحظ أيضًا أنّ isset()‎ و‎!empty()‎ سيعملان ويعيدان false إذا كانت ‎$map غير معرفة أبدًا وهذا يجعلهم عرضة للخطأ نوعًا ما عند الاستخدام:

// "long"و "lang" الفرق بين اسمي المتحولين هو في الكلمتين
$my_array_with_a_long_name = ['foo' => true];

array_key_exists('foo', $my_array_with_a_lang_name); // يظهر تحذير

isset($my_array_with_a_lang_name['foo']); // false

يمكنك أيضًا التحقق في المصفوفات العادية:

$ord = ['a', 'b'];
// [0 => 'a', 1 => 'b'] المصفوفة السابقة تكافئ

array_key_exists(0, $ord); // true
array_key_exists(2, $ord); // false

لاحظ أنّ أداء isset()‎ أفضل من array_key_exists()‎ لأنّ الأخيرة هي دالة والأولى هي بنية لغوية، ويمكنك أيضًا استخدام الدالة key_exists()‎ التي تعد كنية للدالة array_key_exists()‎.

التحقق من نوع المصفوفة

تُرجع الدالة is_array()‎ القيمة true إذا كان المتغير مصفوفة.

$integer = 1337;
$array = [1337, 42];

is_array($integer); // false
is_array($array); // true

يمكنك كتابة تلميح في الدالة أنّ نوع المعامل المفروض هو مصفوفة أي أنّ تمرير أي نوع آخر سيسبب خطأً فادحًا.

function foo (array $array) {
     /* هو مصفوفة $array نوع المتغير */ 
}

يمكنك أيضًا استخدام الدالة gettype()‎.

$integer = 1337;
$array = [1337, 42];

gettype($integer) === 'array'; // false
gettype($array) === 'array'; // true

إنشاء مصفوفة من المتغيرات

$username = 'Hadibut';
$email = 'hadibut@example.org';
$variables = compact('username', 'email');
// ['username' => 'Hadibut', 'email' => 'hadibut@example.org'] هي $variables قيمة

يُستخدم هذا التابع غالبًا في إطارات العمل لتمرير مصفوفة متغيرات بين مكونين.

التحقق من وجود قيمة في مصفوفة

تُرجع الدالة in_array()‎ القيمة true إذا كان العنصر موجودًا في المصفوفة.

$fruits = ['banana', 'apple'];

$foo = in_array('banana', $fruits);
//true هي $foo قيمة

$bar = in_array('orange', $fruits);
//false هي $bar قيمة

ويمكنك أن تستخدم الدالة array_search()‎ لتحصل على مفتاح عنصر ما من المصفوفة.

$userdb = ['Sandra Shush', 'Stefanie Mcmohn', 'Michael'];
$pos = array_search('Stefanie Mcmohn', $userdb);

if ($pos !== false) {
    echo "Stefanie Mcmohn found at $pos";
}

الإصدار PHP 5.x من 5.5 وما فوق

يمكنك بدءًا من الإصدار PHP 5.5 وما بعده استخدام array_column()‎ بالتزامن مع array_search()‎ ويعدّ هذا مفيدًا بشكلٍ خاص للتحقق من وجود قيمة في المصفوفة الترابطية:

$userdb = [
    [
        "uid" => '100',
        "name" => 'Sandra Shush',
        "url" => 'urlof100',
    ],
    [
        "uid" => '5465',
        "name" => 'Stefanie Mcmohn',
        "pic_square" => 'urlof100',
    ],
    [
        "uid" => '40489',
        "name" => 'Michael',
        "pic_square" => 'urlof40489',
    ]
];
$key = array_search(40489, array_column($userdb, 'uid'));

واجهات ArrayAccess وIterator

الميزة المفيدة الأخرى هي الوصول إلى تجميعات الكائن المخصص كمصفوفات في PHP، يوجد واجهتين في PHP بدءًا من الإصدار PHP 5.0.0 لدعم ذلك وهما: ArrayAccess وIterator يتيحان لك الوصول إلى الكائنات المخصصة على أنّها مصفوفات.

ArrayAccess

بفرض لدينا الصنف user يعبر عن مستخدم وجدول في قاعدة البيانات يخزن كل المستخدمين ونريد إنشاء الصنف UserCollection ليقوم بما يلي:

  • يسمح لنا بمخاطبة مستخدم عن طريق معرف الاسم الفريد.
  • أداء العمليات الأساسية (ليس كل عمليات CRUD - الإنشاء والقراءة والتحديث والحذف - إنما على الأقل الإنشاء والاستعادة والحذف) على مجموعة المستخدمين لدينا.

انتبه أننا نستخدم الصياغة القصيرة لإنشاء مصفوفة [] والمتاحة بدءًا من الإصدار 5.4:

class UserCollection implements ArrayAccess {
    protected $_conn;
    protected $_requiredParams = ['username','password','email'];

    public function __construct() {
        $config = new Configuration();
        $connectionParams = [
        // معلومات الاتصال بقاعدة البيانات
        ];

        $this->_conn = DriverManager::getConnection($connectionParams, $config);
    }

    protected function _getByUsername($username) {
        $ret = $this->_conn->executeQuery('SELECT * FROM `User` WHERE `username` IN (?)', [$username])->fetch();
        return $ret;
    }

    // ArrayAccess بدء التوابع المطلوبة من
    public function offsetExists($offset) {
        return (bool) $this->_getByUsername($offset);
    }

    public function offsetGet($offset) {
        return $this->_getByUsername($offset);
    }

    public function offsetSet($offset, $value) {
        if (!is_array($value)) {
            throw new \Exception('value must be an Array');
        }
        $passed = array_intersect(array_values($this->_requiredParams), array_keys($value));
        if (count($passed) < count($this->_requiredParams)) {
            throw new \Exception('value must contain at least the following params: ' .implode(',', $this->_requiredParams));
        }
        $this->_conn->insert('User', $value);
    }

    public function offsetUnset($offset) {
        if (!is_string($offset)) {
            throw new \Exception('value must be the username to delete');
        }
        if (!$this->offsetGet($offset)) {
            throw new \Exception('user not found');
        }
        $this->_conn->delete('User', ['username' => $offset]);
    }
    // ArrayAccess بدء التوابع المطلوبة من
}

بعد ذلك يمكننا كتابة:

$users = new UserCollection();
var_dump(empty($users['testuser']),isset($users['testuser']));

$users['testuser'] = ['username' => 'testuser',
                                'password' => 'testpassword',
                                'email' => 'test@test.com'];

var_dump(empty($users['testuser']), isset($users['testuser']), $users['testuser']);

unset($users['testuser']);
var_dump(empty($users['testuser']), isset($users['testuser']));

بفرض أنه لا يوجد لدينا المستخدم testuser قبل تنفيذ الشيفرة فسيكون لدينا الخرج التالي:

bool(true)
bool(false)
bool(false)
bool(true)
array(17) {
    ["username"]=> string(8) "testuser"
    ["password"]=> string(12) "testpassword"
    ["email"]=> string(13) "test@test.com"
}
bool(true)
bool(false)

ملاحظة: لا تُستدعى الدالة offsetExists عندما تريد التحقق من وجود مفتاح مع دالة array_key_exists، لذا فإنّ الشيفرة التالية سيكون خرجها false مرتين:

var_dump(array_key_exists('testuser', $users));
$users['testuser'] = ['username' => 'testuser',
                                'password' => 'testpassword',
                                'email' => 'test@test.com'];
var_dump(array_key_exists('testuser', $users));

Iterator

سنوسع الصنف في الأعلى بإضافة عدة دوال من الواجهة Iterator لنستطيع استخدام التكرار مع foreach وwhile.

نحتاج أولًا إلى خاصيّة تحتوي الفهرس الحالي للمكرِّر، سنسميها ‎$_position ونضيفها إلى خاصيّات الصنف:

// Iterator موقع المكرِّر الحالي مطلوب من توابع الواجهة
protected $_position = 1;

ثم نضيف الواجهة Iterator إلى قائمة الواجهات التي سينفذها صنفنا:

class UserCollection implements ArrayAccess, Iterator {

ثم نضيف المطلوب من دوال الواجهة Iterator:

// Iterator بدء التوابع المطلوبة من الواجهة
public function current () {
return $this->_getById($this->_position);
}

public function key () {
    return $this->_position;
}

public function next () {
    $this->_position++;
}

public function rewind () {
    $this->_position = 1;
}

public function valid () {
    return null !== $this->_getById($this->_position);
}
// Iterator نهاية التوابع المطلوبة من الواجهة

أصبح لدينا مصدر كامل لتنفيذ الصنف لكِلا الواجهتين، لاحظ أنّ هذا المثال ليس مثاليًا لأنّ المعرفات في قاعدة البيانات قد لا تكون تسلسلية لكن كتبناه لإعطائك فكرةً أساسيةً وهي أنّه بإمكانك مخاطبة تجميعات الكائنات بأي طريقة ممكنة عن طريق تنفيذ الواجهتين ArrayAccess وIterator.

class UserCollection implements ArrayAccess, Iterator {

// Iterator موقع المكرِّر الحالي المطلوب من توابع الواجهة
protected $_position = 1;

// <إضافة التوابع القديمة من الشيفرة السابقة هنا>

// Iterator بدء التوابع المطلوبة من الواجهة
public function current () {
    return $this->_getById($this->_position);
}

public function key () {
    return $this->_position;
}

public function next () {
    $this->_position++;
}

public function rewind () {
    $this->_position = 1;
}

public function valid () {
    return null !== $this->_getById($this->_position);
}
// Iterator نهاية التوابع المطلوبة من الواجهة
}

ولكتابة حلقة تمر على كل الكائنات من نوع user باستخدام foreach:

foreach ($users as $user) {
    var_dump($user['id']);
}

سينتج عن الشيفرة السابقة الخرج التالي:

string(2) "1"
string(2) "2"
string(2) "3"
string(2) "4"
...

تكرار عدة مصفوفات معًا

قد نحتاج أحيانًا إلى تكرار مصفوفتين لهما نفس الطول معًا مثال:

$people = ['Tim', 'Tony', 'Turanga'];
$foods = ['chicken', 'beef', 'slurm'];

أبسط طريقة لتنفيذ ذلك هي استخدام الدالة array_map:

array_map(function($person, $food) {
    return "$person likes $food\n";
}, $people, $foods);

سينتج عن ذلك الخرج التالي:

assert(count($people) === count($foods));
for ($i = 0; $i < count($people); $i++) {
    echo "$people[$i] likes $foods[$i]\n";
}

إذا لم يكن للمصفوفتين مفاتيح تكرارية يمكننا استخدام array_values($array)[$i]‎ بدلًا من ‎$array[$i]‎، وإذا كان لهما نفس ترتيب المفاتيح يمكننا استخدام حلقة foreach مع مفتاح على إحداهما:

foreach ($people as $index => $person) {
    $food = $foods[$index];
    echo "$person likes $food\n";
}

يمكن تكرار المصفوفات المستقلة فقط إذا كان لها نفس الطول ونفس اسم المفتاح، أي أنّه إذا لم يكن للمصفوفات مفاتيحًا فالمفاتيح مرقمة وهذا جيّد أو يمكنك تسمية المفاتيح ووضعهم في نفس الترتيب لكل مصفوفة، ويمكنك أيضًا استخدام الدالة array_combine.

$combinedArray = array_combine($people, $foods);
// $combinedArray = ['Tim' => 'chicken', 'Tony' => 'beef', 'Turanga' => 'slurm'];

بعدها يمكنك كتابة حلقة تكرار كما في السابق:

foreach ($combinedArray as $person => $meal) {
    echo "$person likes $meal\n";
}

استخدام فهرس تزايدي

تعمل هذه الطريقة على زيادة عدد صحيح من 0 وحتى أكبر فهرس في المصفوفة.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = 0; $i < count($colors); $i++) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

يمكنك أيضًا المرور على جميع عناصر المصفوفة بترتيب عكسي دون استخدام الدالة array_reverse التي قد تزيد الحِمل إذا كانت المصفوفة كبيرة.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = count($colors) - 1; $i >= 0; $i--) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

يمكنك تخطي أو إرجاع الفهرس بسهولة مستخدمًا هذه الطريقة.

$array = ["alpha", "beta", "gamma", "delta", "epsilon"];

for ($i = 0; $i < count($array); $i++) {
    echo $array[$i], PHP_EOL;
    if ($array[$i] === "gamma") {
        $array[$i] = "zeta";
        $i -= 2;
    } elseif ($array[$i] === "zeta") {
        $i++;
    }
}

الخرج:

alpha
beta
gamma
beta
zeta
epsilon

لا يمكن أن نقوم بهذا بشكلٍ مباشر في المصفوفات التي لا تحوي فهارس تزايدية (بما في ذلك المصفوفات التي تكون فهارسها بترتيب عكسي مثل: ‎[1 => "foo", 0 => "bar"], ["foo" => "f", "bar" => "b"]‎)، لذا نستخدم الدوال array_values أو array_keys:

$array = ["a" => "alpha", "b" => "beta", "c" => "gamma", "d" => "delta"];
$keys = array_keys($array);

for ($i = 0; $i < count($array); $i++) {
    $key = $keys[$i];
    $value = $array[$key];
    echo "$value is $key\n";
}

استخدام مؤشرات المصفوفة الداخلية

تحوي كل نسخة مصفوفة مؤشرًا داخليًا، يمكن باستخدام هذا المؤشر استعادة عناصر مختلفة من المصفوفة عن طريق نفس الاستدعاء في مرات مختلفة.

استخدام الدالة each

يُرجع كل استدعاء للدالة مفتاح وقيمة عنصر المصفوفة الحالي ويزيد مؤشر المصفوفة الداخلي.

$array = ["f" => "foo", "b" => "bar"];
while (list($key, $value) = each($array)) {
    echo "$value begins with $key";
}

استخدام الدالة next

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (($value = next($array)) !== false) {
    echo "$value\n";
}

لاحظ أنّ هذا المثال يفترض أنّه لا يوجد عناصر في المصفوفة معرّفة بالقيمة المنطقية false، لمنع هذا الافتراض نستخدم الدالة key للتحقق من وصول المؤشر الداخلي إلى نهاية المصفوفة:

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (key($array) !== null) {
    echo current($array) . PHP_EOL;
    next($array);
}

ويسهّل هذا أيضًا تكرار المصفوفة دون حلقة مباشرة:

class ColorPicker {
    private $colors = ["#FF0064", "#0064FF", "#64FF00", "#FF6400", "#00FF64", "#6400FF"];

    public function nextColor() : string {
        $result = next($colors);
        // إذا وصلت لنهاية المصفوفة
        if (key($colors) === null) {
            reset($colors);
        }
        return $result;
    }
}

استخدام foreach

حلقة مباشرة

foreach ($colors as $color) {
    echo "I am the color $color<br>";
}

حلقة مع مفاتيح

$foods = ['healthy' => 'Apples', 'bad' => 'Ice Cream'];
foreach ($foods as $key => $food) {
    echo "Eating $food is $key";
}

حلقة بالمرجعية

إنّ تعديل قيمة (‎$color أو ‎$food) في الأمثلة السابقة بشكلٍ مباشر لا يغيّر قيمتها في المصفوفة إنّما يجب استخدام العامل & لتصبح القيمة هي مؤشر مرجعي للعنصر في المصفوفة.

$years = [2001, 2002, 3, 4];
foreach ($years as &$year) {
    if ($year < 2000) $year += 2000;
}

الشيفرة السابقة مماثلة للشيفرة التالية:

$years = [2001, 2002, 3, 4];
for($i = 0; $i < count($years); $i++) { 
    $year = &$years[$i];
    if($year < 2000) $year += 2000;
}

التزامن

يمكن تعديل مصفوفات PHP أثناء التكرار بدون مشاكل تزامن، إذا كانت المصفوفة تُكرَّر بالمرجع فإنّ التكرارات اللاحقة ستتأثر بتغييرات المصفوفة وإلا فإنّها لن تتأثر (كما لو أنّك تكرر نسخة من المصفوفة نفسها)، وازن التكرار بالقيمة:

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];

foreach ($array as $key => $value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
echo "$key => $value\n";
}

الخرج:

0 => 1
2 => 3
4 => 5
6 => 7

أما إذا كانت المصفوفة تُكرَّر بالمرجع:

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];

foreach ($array as $key => &$value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

الخرج:

0 => 1
2 => 3
6 => 17

لن تُكرَّر مجموعة القيمة-المفتاح 4‎ => 5 وستتغير 6‎ => 7 إلى ‎6 => 17‎.

استخدام المكرِّر ArrayObject

يسمح لك الصنف arrayiterator بتعديل وإلغاء ضبط القيم أثناء تكرار المصفوفات والكائنات. مثال:

$array = ['1' => 'apple', '2' => 'banana', '3' => 'cherry'];

$arrayObject = new ArrayObject($array);

$iterator = $arrayObject->getIterator();

for($iterator; $iterator->valid(); $iterator->next()) {
    echo $iterator->key() . ' => ' . $iterator->current() . "</br>";
}

الخرج:

1 => apple
2 => banana
3 => cherry

ترجمة -وبتصرف- للفصول [Arrays - Array iteration] من كتاب PHP Notes for Professionals book

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...