مرحبًا بالجميع ، لقد مر عام تقريبًا على نشر الجزء الأول . كانت المناقشة في التعليقات ساخنة ، واستخلصت استنتاجات بنفسي ، وقمت بإجراء تغييرات على 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 جديد من المصفوفة المعدلة.
هذا كل شئ. شكرا للقراءة.