العمل مع مصفوفات PHP من النوع الآمن ، الجزء الثاني

مرحبًا بالجميع ، لقد مر عام تقريبًا على نشر الجزء الأول . كانت المناقشة في التعليقات ساخنة ، واستخلصت استنتاجات بنفسي ، وقمت بإجراء تغييرات على lib على الفور تقريبًا ، ولكن لم يكن هناك وقت للكتابة عن هذا.

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

وبالطبع سأكتب عن العمل على الأخطاء.

بالنسبة لأولئك الذين لم يعرفوا ونسوا ما هو ArrayHandler

المفسد

دعنا نجيب على السؤال: "ما هو نوع العمل الآمن مع المصفوفات في PHP؟"

النوع الآمن هو:

  • ;

  • ;

, , - . , :

$a = 0;
if (key_exists($key, $collection)) 
{
	$a = (int) $collection[$key];
}

:

$a = (int) $collection[$key] ?? 0;

, " ".

بالإضافة إلى هذه المزايا الثلاث ، يوفر ArrayHandler الثبات ، أي أنه يمكننا تمرير ArrayHandler بأمان عبر طبقات من التجريدات ولن يقوم أحد بتغيير العناصر داخل المصفوفة الأصلية عن طريق الخطأ. لتغيير القيمة ، تحتاج إلى إنشاء مثيل جديد من ArrayHandler - وهذا أكثر صعوبة لتخطي مراجعة الكود من تخطي كتابة قيمة جديدة إلى عنصر مصفوفة.

لن أقوم بنسخ ولصق أمثلة للعمل مع أي منهما ، يمكنك رؤيتها في الجزء الأول أو يمكنك قراءة الوثائق .

يتم تثبيت Liba من خلال Composer:

composer require sbwerewolf/language-specific

هناك إصدارات PHP 5.6 / 7.0 / 7.2.

لقد كانت مقدمة طويلة الآن للنقطة.

التحديثات

قبل يومين كنت حزينًا ومللًا في الوقت نفسه ، أردت أن أفعل شيئًا جيدًا ، على سبيل المثال ، أصنعه بحيث عندما تتكرر على العناصر باستخدام foreach () ، لا يمكنك فقط الحصول على عنصر (ValueHandler) ، ولكن فهرس هذا العنصر.

لقد عملت بحماس وبعد أن كتبت بالفعل الكثير من التعليمات البرمجية ، صادفت تعليقًا في وثائق PHP جعل كل الكود الجديد عديم الفائدة.

اتضح أنه يمكنك القيام بذلك:

yield $key => $value;

وستعيد foreach () فهرس العنصر. يوريكا!

الآن يقوم IArrayHandler :: pulling () بإرجاع كل من IArrayHandler الجديد من عنصر المصفوفة وفهرس هذا العنصر. كنت سعيدًا ، يبدو الآن أن ArrayHandler أصبحت مكتبة مثالية للعمل مع المصفوفات (كما أشرت في بداية المقال).

. - IArrayHandler::getting(), Iterator ArrayHandler foreach() .

IArrayHandler::pulling() ArrayHandler ( , ). "pulling" - IArrayHandler::pull(), ArrayHandler .

IArrayHandler::getting() IValueHandler , . "getting" - IArrayHandler::get(), IValueHandler .

IArrayHandler::pulling() , IArrayHandler::getting() .

:

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'arrays'.PHP_EOL;
foreach ($data->pulling() as $key => $value) {
    echo "[$key] => class is ".get_class($value).' '.PHP_EOL;
}
echo 'values'.PHP_EOL;
foreach ($data->getting() as $key => $value) {
    echo "[$key] => {$value->asIs()} , class is ".get_class($value).' '.PHP_EOL;
}

:

arrays
[first] => class is LanguageSpecific\ArrayHandler 
[next] => class is LanguageSpecific\ArrayHandler 
[last] => class is LanguageSpecific\ArrayHandler 
[4] => class is LanguageSpecific\ArrayHandler 
values
[5] => 7 , class is LanguageSpecific\ValueHandler 
[6] => 8 , class is LanguageSpecific\ValueHandler 
[7] => 9 , class is LanguageSpecific\ValueHandler

, foreach():

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'ALL'.PHP_EOL;
foreach ($data as $key => $value) {
    $type = gettype($value->asIs());
    echo "[$key] => value type is $type , class is ".get_class($value).PHP_EOL;
}

:

ALL
[first] => value type is array , class is LanguageSpecific\ValueHandler
[next] => value type is array , class is LanguageSpecific\ValueHandler
[last] => value type is array , class is LanguageSpecific\ValueHandler
[4] => value type is array , class is LanguageSpecific\ValueHandler
[5] => value type is integer , class is LanguageSpecific\ValueHandler
[6] => value type is integer , class is LanguageSpecific\ValueHandler
[7] => value type is integer , class is LanguageSpecific\ValueHandler

, , , foreach(), :

foreach ($data as $key => $value) {
    /* @var \LanguageSpecific\ValueHandler $value */
    if($value->type() === 'array'){
        $handler = new ArrayHandler($value->array());
        /* some code */
    }
}

IValueHandler::default() , @GreedyIvan, , .

ArrayHandler::simplify() ,

ArrayHandler->simplify(), array_column? (c) @olegmar

C @olegmar.

تم استبدال طريقة IArrayHandler :: next () بـ IArrayHandler :: pulling () ، وهذه الطريقة تتكرر عبر جميع المصفوفات المتداخلة (مستوى التداخل الأول). لا يعني ذلك أن تعليقHett أقنعني بشكل مباشر ، لكنه دفعني إلى التفكير.

شكرًا @ ReDev1L على الدعم في التعليقات.

تمت إضافة طريقة IArrayHandler :: raw () للحصول على المصفوفة الأصلية. في السابق ، عندما لم يكن من الممكن الحصول على فهرس عنصر ، كان من الضروري التكرار على المصفوفة الأصلية ، والآن ، من تجربة الاستخدام ، من الضروري إضافة / طرح عناصر المصفوفة وإنشاء ArrayHandler جديد من المصفوفة المعدلة.

هذا كل شئ. شكرا للقراءة.




All Articles