لقد كنت أستخدم وظيفة array_search() لفترة طويلة للبحث عن القيم في مصفوفة، حيث سمعت وقرأت مرارًا وتكرارًا أنها تعمل بشكل أسرع بشكل ملحوظ من البحث في مصفوفة في حلقة، لكنني لم أفعل ذلك تعرف كم هو أسرع. أخيرًا تمكنت من التحقق منها وإحصائها بنفسي.

لقد قارنت سرعة البحث من خلال مصفوفة باستخدام هذه الوظيفة مع البحث المعتاد من خلال مصفوفة في حلقات foreach و while. في عناصر المصفوفة 10-100 يكون الفرق غير ملحوظ والوقت قصير جدًا بحيث يمكن إهماله. ولكن بالنسبة للمصفوفات الكبيرة، تبين أن الفرق كبير جدًا. مع زيادة حجم المصفوفة بترتيب من حيث الحجم، زاد وقت البحث أيضًا بشكل ملحوظ. مع مائة ألف عنصر، انخفضت سرعة foreach إلى 0.013 ثانية، وفي حين - إلى 0.017، بينما تباطأ array_search() أيضًا، لكنه ظل أسرع بمقدار 0.004 ثانية. بالنسبة لبرنامج نصي كبير يعمل مع مصفوفات كبيرة، فإن استبدال البحث في حلقة ببحث باستخدام array_search() لن يكون "تحسينًا للبرغوث" على الإطلاق.

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

محدث: أنت بحاجة إلى عقلية المبرمج أيضًا! والحرص على ذاكرتك لن يضر (مستوحاة من الفواصل والمدى :)

يوجد أسفل الاختراق رمز البرنامج النصي الذي تم استخدامه لحساب الوقت:

كتلة $=100000; // عدد القيم في المصفوفة التي سنبحث فيها
بحث $=50000; // سنبحث عن هذه القيمة في المصفوفة
$first_result=array(); // مجموعة من النتائج لحساب متوسط ​​قيمة الخيار الأول
$sec_result=array(); // مجموعة من النتائج لحساب متوسط ​​قيمة الخيار الثاني
$third_result=array(); // مجموعة من النتائج لحساب متوسط ​​قيمة الخيار الثالث

// إنشاء وتعبئة المصفوفة
$test_array = range(0, $mass-1); // بفضل SelenIT))

/*
$test_array=array();
لـ ($i=0; $i<$mass; $i++)
{
$test_array=$i;
}
*/

// حلقة لحساب القيم المتوسطة
لـ ($د=0؛ $د<30; $d++) {

//*************** البحث باستخدام array_search *******************

// ابدأ في حساب الوقت
$time_start = ميكروتايم(1);
// يبحث
$key = array_search($search, $test_array, true);
// إذا وجدت
إذا ($key!==FALSE) // ضروري!== وليس!=، لأن رقم العنصر الأول هو 0
{
صدى $test_array[$key];
}
$time_end = ميكروتايم(1);
// عد نهاية الوقت

// الكتابة إلى مجموعة من القيم
$first_result= $time_end - $time_start;

//*************** البحث في مصفوفة باستخدام حلقة foreach *******************

// ابدأ في حساب الوقت
$time_start = ميكروتايم(1);
// البحث نفسه
foreach ($test_array كـ $ta)
{
إذا ($تا==$بحث)
{
صدى $تا؛
استراحة؛
}
}
$time_end = ميكروتايم(1);
// عد نهاية الوقت

// الكتابة إلى مجموعة من القيم
$sec_result= $time_end - $time_start;

//*************** البحث في مصفوفة باستخدام حلقة while *******************

// ابدأ في حساب الوقت
$time_start = ميكروتايم(1);

// تحديد طول المصفوفة
$count=count($test_array);
$ي=0;
// البحث نفسه
بينما (ي<$count)
{
إذا ($test_array[$j]==$search) // إذا وجد
{
صدى $test_array[$j];
استراحة؛
}
$ي++;
}
$time_end = ميكروتايم(1);
// عد نهاية الوقت

// الكتابة إلى مجموعة من القيم
$third_result= $time_end - $time_start;
}

$srednee1=array_sum($first_result)/count($first_result);
$srednee2=array_sum ($ Second_result)/count($sec_result);
$srednee3=array_sum ($third_result)/count($third_result);

Printf("تم إكمال الكود الأول في المتوسط: %.7f ثانية"، $srednee1);
printf("تم إكمال الكود الثاني في المتوسط ​​خلال: %.7f ثانية"، $srednee2);
printf("اكتمل الكود الثالث في المتوسط ​​خلال: %.7f ثانية"، $srednee3);

// نتيجة:
// الكود الأول المكتمل في المتوسط: 0.0000295 ثانية
// الكود الثاني مكتمل في المتوسط: 0.0153386 ثانية
// الكود الثالث مكتمل في المتوسط: 0.0226001 ثانية

إحدى العمليات الرئيسية عند العمل مع المصفوفات هي البحث عن قيمة محددة. تم تصميم وظيفة PHP array_search() لهذا الغرض. إنه قادر على معالجة المجموعات أحادية البعد والمجموعات الترابطية، وإرجاع مفتاح القيمة التي تم البحث عنها إذا تم العثور عليها في المصفوفة.

بناء الجملة

الوصف الرسمي لوظيفة array_search() في PHP هو كما يلي:

array_search مختلطة (قيمة مختلطة، مجموعة $ مجموعة [، منطقية صارمة])

معلمات الإدخال:

  • مجموعة $ - المصفوفة التي سيتم إجراء البحث فيها؛
  • القيمة - القيمة المطلوبة من أي نوع؛
  • صارمة هي علامة منطقية اختيارية تحدد آلية مقارنة صارمة للنوع.

آلية العمل

وظيفة PHPيقوم array_search() بمقارنة القيمة واحدة تلو الأخرى مع جميع القيم الموجودة في مصفوفة المجموعة. افتراضيًا، يتم إجراء المقارنة بغض النظر عن أنواع المعاملات. يمكن تغيير هذا الإعداد عن طريق تعيين العلامة الصارمة على TRUE. تعتبر مقارنات السلسلة حساسة لحالة الأحرف.

إذا تم العثور على تطابق، فسيتم إرجاع المفتاح المقابل للعنصر الذي تم العثور عليه وتتوقف الوظيفة عن العمل. ولذلك، لا يمكن استخدامه للكشف عن تكرارات متعددة للقيمة المطلوبة في صفيف.

إذا لم يتم العثور على أي تطابقات، فستُرجع الدالة القيمة المنطقية FALSE.

يجب عليك التحقق من النتيجة التي تم إرجاعها باستخدام عامل المساواة الصارم (===). يعد هذا أمرًا مهمًا لأن الدالة قد تُرجع قيمة تم تحويلها إلى FALSE، مثل 0 أو السلسلة الفارغة.

أمثلة على الاستخدام

مثال 1. عند تمرير مصفوفة متعددة الأبعاد إلى الدالة PHP array_search()، ستكون نتيجة العمل هي مفتاح العنصر الذي تم البحث عنه.

"شتاء"، "الموسم 2" => "الربيع"، "الموسم 3" => "الصيف"، "الموسم 4" => "الخريف")؛ $result1 = array_search("winter", $array); $result2 = array_search("summer", $array); $result3 = array_search("أبريل", $array); ?>

في هذا المثال، سيتم تعيين $result1 على "season1"، وسيتم تعيين $result2 على "season3"، وسيتم تعيين $result3 على القيمة المنطقية FALSE لأن السلسلة "april" لا تظهر في المصفوفة المصدر.

مثال 2. يمكن للدالة PHP array_search() أيضًا معالجة مصفوفة أحادية البعد، معتبرة مفاتيحها بمثابة المؤشرات الرقمية التالية.

سيتم تعيين متغير النتيجة $ على 1، وفقًا لفهرس عنصر "الصياد" في المصفوفة $.

مثال 3. خطأ محتمل عند تحليل النتيجة.

"واشنطن"، 1 => "آدامز"، 2 => "جيفرسون"، 3 => "ماديسون"، 4 => "مونرو")؛ $result = array_search("واشنطن", $presidents); if (!$result) ( echo "لم يكن ج. واشنطن أول رئيس للولايات المتحدة الأمريكية"; ) ?>

لذلك، دون التحقق من النتيجة مع المساواة الصارمة، يمكنك الحصول على رسالة غير متوقعة مفادها أن جورج واشنطن لم يكن أول رئيس للولايات المتحدة.

مثال 4: يتم إرجاع مفتاح المطابقة الأولى التي تم العثور عليها فقط.

على الرغم من أن القيمة التي تبحث عنها تحدث ثلاث مرات في المصفوفة، فإن الدالة ستعيد فقط النتيجة الأولى التي تم العثور عليها - 0. للعثور على تطابقات متعددة، يوصى باستخدام وظيفة PHP array_keys().

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

وظائف للبحث في مجموعة:
array_search- يستخدم للبحث عن قيمة في مصفوفة. إذا نجحت، فإنها تُرجع مفتاح القيمة المطلوبة؛ وإذا لم يتم العثور على شيء، فإنها تُرجع خطأ. قبل الإصدار PHP 4.2.0، كان الدالة array_search()‎ تُرجع NULL بدلاً من FALSE عند الفشل.

بناء جملة الدالة مختلط array_search (إبرة مختلطة، صفيف كومة قش [، منطقي صارم]).

foreach (array_expression كقيمة $)
إفادة
foreach (array_expression كـ $key => $value)
إفادة

مثال على استخدام دالة ذات البنية foreach للبحث عن عنصر مصفوفة، وإرجاع TRUE عند النجاح

بناء الجملة
بينما (إكسبر)
إفادة

إرجاع مفتاح عنصر الصفيف عند النجاح

من جدول القياسات يتبين أن الوظيفة array_search، يعرض أفضل النتائج عند البحث في صفائف صغيرة وكبيرة. وفي الوقت نفسه، يزداد وقت البحث باستخدام الحلقات بشكل كبير اعتمادًا على حجم المصفوفة.

من متعدد الأبعاد (18)

لقد قمت بتعديل أحد الأمثلة أدناه لوصف وظيفة array_search. تقوم الدالة searchItemsByKey بإرجاع كافة القيم بواسطة $key من مصفوفة متعددة الأبعاد (مستويات N). ربما سيكون هذا مفيدًا لشخص ما. مثال:

$arr = array("XXX"=>array("YYY"=> array("AAA"=> array("keyN" =>"value1")), "ZZZ"=> array("BBB"=> صفيف ("keyN" => "value2")) //.....)); $result = searchItemsByKey($arr,"keyN"); مطبعة "

"؛ print_r($result); طباعة " 
"؛ // صفيف الإخراج ( => value1 => value2)

رمز الوظيفة:

دالة searchItemsByKey($array, $key) ( $results = array(); if (is_array($array)) ( if (isset($array[$key]) && key($array)==$key) $results = $array[$key]; foreach ($array as $sub_array) $results = array_merge($results, searchItemsByKey($sub_array, $key));

لدي مصفوفة حيث أريد البحث عن uid والحصول على مفتاح المصفوفة.

أمثلة

لنفترض أن لدينا المصفوفة ثنائية الأبعاد التالية:

$userdb = array(array("uid" => "100"، "name" => "Sandra Shush"، "pic_square" => "urlof100")، array("uid" => "5465"، "name" => "ستيفاني مكموهن"، "pic_square" => "urlof100")، array("uid" => "40489"، "name" => "Michael"، "pic_square" => "urlof40489"));

يجب أن يؤدي استدعاء search_by_uid(100) (المعرف الفريد للمستخدم الأول) إلى إرجاع 0.

يجب أن يُرجع استدعاء الدالة search_by_uid(40489) 2.

لقد حاولت إنشاء حلقات، لكني بحاجة إلى تنفيذ تعليمات برمجية أسرع.

بناءً على إجابة جاكوب الممتازة، إليك بحثًا أكثر عمومية سيسمح لك بتحديد المفتاح (ليس فقط للمعرف الفريد):

مصفوفة البحث عن الوظائف($value, $key, $array) ( foreach ($array as $k => $val) ( if ($val[$key] == $value) ( ​​​​return $k; ) ) إرجاع فارغ ;)

الاستخدام: $results = searcharray("searchvalue"، searchkey, $array);

دالة searchForId($id, $array) ( foreach ($array as $key => $val) ( if ($val["uid"] === $id) ( return $key; ) ) return null; )

وسوف تنجح. يجب أن تسميها هكذا:

$id = searchForId("100", $userdb);

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

بناء على الجواب الأنجورا. في الإصدارات الأحدث من PHP (>= 5.5.0) يمكنك استخدام سطر واحد.

$key = array_search("100"، array_column($userdb, "uid"));

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

دالة searchArrayKeyVal($sKey, $id, $array) ( foreach ($array as $key => $val) ( if ($val[$sKey] == $id) ( return $key; ) ) return false; )

بدلاً من ذلك، استبدل "uid" المعين مسبقًا بمعلمة في الوظيفة، لذا فإن استدعاء الكود أدناه يعني أنه يمكنك استخدام دالة واحدة لأنواع متعددة من المصفوفات. تغيير طفيف، لكنه مختلف قليلا.

// صفيف بيانات المستخدمين $userdb = array (array ("uid" => "100"، "name" => "Sandra Shush"، "url" => "urlof100")، array ("uid" => " 5465"،"اسم" => "ستيفاني ماكموهن"،"url" => "urlof100")، صفيف ("uid" => "40489"، "اسم" => "Michael"، "url" => "urlof40489" ")،)؛ // الحصول على مفتاح المصفوفة $arrayKey = searchArrayKeyVal("uid", "100", $userdb); إذا ($arrayKey!==false) ( echo "نتيجة البحث: ", $userdb[$arrayKey]["name"]; ) else ( echo "لا يمكن العثور على نتيجة البحث"; )

إذا (! function_exists("arraySearchMulti"))( function arraySearchMulti($search,$key,$array,$returnKey=false) ( foreach ($array as $k => $val) ( if (isset($val[$ key])) ( if ((string)$val[$key] == (string)$search) ( return ($returnKey ? $k: $val); ) )else( return (is_array($val) ? arraySearchMulti ($search,$key,$val,$returnKey): null);

يمكنك استخدام هذه الوظيفة. https://github.com/serhatozles/ArrayAdvancedSearch

="2""; $Array = array("a" => array("d" => "2"), array("a" => "مثال للعالم", "b" => "2"), array("c" => "3"), array("d" => "4"),); $Result = ArraySearch($Array,$query,1);

"؛ print_r($Result); صدى "
"; // الإخراج: // المصفوفة // (// => المصفوفة // (// [a] => عالم المثال // [b] => 2 //) // //)

إذا كان السؤال، أي.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "discount_amount" => 3.29, "discount_id" => "5a92656a14d488570c2c44a2", ], [ "_id" => "5a9790fd14d48879cf16a9e8", " ديس count_amount" => 4.53، " Discount_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "discount_amount" => 15.24, "discount_id" => "5a92806a14d48858ff5c2ec3", ], [ "_ المعرف" > "5a982a4914d48824721eafe3"، "discount_amount " => 45.74, "discount_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "discount_amount" => 10.26, "discount_id" => "5a928ce414d488609e73b 4 43"، ]، ]؛

دالة searchForId($id, $array) ( $did=0; $dia=0; foreach ($array as $key => $val) ( if ($val["discount_id"] === $id) ( $ dia +=$val["discount_amount"]; $did++ ) if($dia != "") ( echo $dia; var_dump($did); ) return null); print_r(searchForId("5a928ce414d488609e73b443",$a));

جرب هذا أيضا

دالة search_in_array($srchvalue, $array) ( if (is_array($array) && count($array) > 0) ( $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) ( foreach ($صفيف كـ $key => $value) ( ​​​​if (is_array($value) && count($value) > 0) ( $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE ) إرجاع $foundkey )) ) وإلا قم بإرجاع $foundkey;

$a = ["x" => ["eee"، "ccc"], "b" => ["zzz"]]; $ Found = null; $search = "eee"; array_walk($a, function ($k, $v) use ($search, &$found) ( if (in_array($search, $k)) ( $found = $v; ) )); var_dump($found);

وهنا بطانة واحدة لنفس الشيء،

$pic_square = $userdb["pic_square"];

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

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

/** * @param array multi Dimension * @param قيمة السلسلة المراد البحث عنها، أي اسم حقل محدد مثل name_first * @param string associative key للعثور عليها، أي field_name * * @return مفاتيح المصفوفة.

*/ function search_revisions($dataArray, $search_value, $key_to_search) ( // ستبحث هذه الوظيفة في المراجعات عن قيمة معينة // تتعلق بالمفتاح النقابي الذي تبحث عنه. $keys = array(); foreach ($dataArray) كـ $key => $cur_value) ( ​​​​if ($cur_value[$key_to_search] == $search_value) ( ​​​​$keys = $key; ) ) يُرجع مفاتيح $؛

انتهى بي الأمر لاحقًا بكتابة هذا للسماح لي بالبحث عن قيمة مختلفة ومفتاح ارتباطي. لذا فإن المثال الأول الخاص بي يسمح لك بالبحث عن قيمة في أي مفتاح اقتران محدد وإرجاع جميع المطابقات. يوضح هذا المثال الثاني مكان العثور على القيمة ("Taylor") في مفتاح اقتران محدد (الاسم_الأول).و

تم العثور على قيمة أخرى (صحيح) في مفتاح اقتران آخر (مستخدم) وتقوم بإرجاع جميع المطابقات (المفاتيح التي يُطلق عليها الأشخاص الذين يُسمون "تايلور" ويتم استخدامها).

/** * @param مصفوفة متعددة الأبعاد * @param string $search_value القيمة المطلوب البحث عنها، أي "Taylor" محدد * @param string $key_to_search المفتاح النقابي للعثور عليه، أي الاسم الأول * @param string $other_matching_key النقابي المفتاح الذي يمكن العثور عليه في المطابقات للموظفين * @param string $other_matching_value القيمة التي يمكن العثور عليها في هذا المفتاح النقابي المطابق، أي صحيح * * @return مفاتيح المصفوفة، أي جميع الأشخاص الذين يحملون الاسم الأول "تايلور" العاملين.

$data = array(array("cust_group" => 6, "price" => 13.21, "price_qty" => 5), array("cust_group" => 8, "price" => 15.25, "price_qty" => 4)، array("cust_group" => 8, "price" => 12.75, "price_qty" => 10)); $findKey = search_revisions($data،"8"، "cust_group"، "10"، "price_qty")؛ print_r($findKey);

نتيجة

المصفوفة (=> 2)

/** * يبحث في مصفوفة بسيطة ومتعددة الأبعاد * @param type $needle * @param type $haystack * @return boolean */ public static function in_array_multi($needle, $haystack)( $needle = Trim($needle ); if(!is_array($haystack)) return False; foreach($haystack as $key=>$value)( if(is_array($value))( if(self::in_array_multi($needle, $value)) return True else self::in_array_multi($needle, $value) else if(trim($value) === Trim($needle))(// إصلاح الرؤية// error_log("$value === رؤية الإبرة $" الإعداد إلى 1 مخفي")؛ إرجاع صحيح؛ ) ) إرجاع خطأ؛ )

إذا كنت تستخدم (PHP 5>=5.5.0) فلن تحتاج إلى كتابة وظيفتك الخاصة لهذا الغرض، فقط اكتب هذا السطر وستنتهي.

إذا كنت تريد نتيجة واحدة فقط:

$key = array_search(40489, array_column($userdb, "uid"));

للحصول على نتائج متعددة

$keys = array_keys(array_column($userdb, "uid"), 40489);

إذا كان لديك مصفوفة ترابطية كما هو مذكور في التعليقات، فيمكنك القيام بذلك باستخدام:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);

إذا كنت تستخدم PHP<5.5.0, вы можете использовать этот backport , спасибо ramsey!

تحديث. أقوم بإجراء بعض الاختبارات البسيطة ويبدو أن نموذج النتائج المتعددة هو الأسرع، بل أسرع من وظيفة جاكوب المخصصة!

في الإصدارات الأحدث من PHP (>=5.5.0) يمكنك استخدام هذا السطر الواحد:

$key = array_search("100"، array_column($userdb, "uid"));

بالتوسع في الوظيفة التي أنشأها @mayhem، سيكون هذا المثال بمثابة بحث "غامض" إذا كنت تريد فقط مطابقة جزء من ( كبيرالجزء) سلاسل البحث:

البحث عن الدالة ArrayKeyVal($sKey, $id, $array) ( foreach ($array as $key => $val) ( if (strpos(strtolower($val[$sKey]), strtolower(trim($id)) ! == خطأ) (إرجاع مفتاح $; ) ) إرجاع خطأ)

على سبيل المثال، القيمة الموجودة في الصفيف هي مرحبًا بك في نيويورك! وتحتاج فقط إلى النسخة الأولى من "نيويورك!"

اضطررت إلى استخدام الدالة un، التي تبحث عن جميع العناصر الموجودة في المصفوفة. لذلك قمت بتعديل الوظيفة التي يؤديها Jakub Truneček على النحو التالي:

دالة search_in_array_r($needle, $array) ( $found = array(); foreach ($array as $key => $val) ( if ($val == $needle) ( array_push($found, $val); ) ) if (count($found) != 0) return $found else return null;

$search1 = "تجريبي"; $search2 = "بوب"; $arr = array("0" => "hello"، "1" => "test"، "2" => "john"، "3" => array("0" => "مارتن"، "1" " => "بوب"),"4" => "demo"); foreach ($arr as $value) ( ​​​​if (is_array($value)) ( if (in_array($search2, $value)) ( echo "بنجاح"; // تنفيذ التعليمات البرمجية الخاصة بك ) ) آخر ( if ($value) == $search1) (صدى "النجاح"; ) ) )

إذا أمكن، أدخل أنواع المعلمات. ولكنها تعمل فقط مع الأنواع البسيطة مثل int وbool وfloat.

$unsafe_variable = $_POST["user_id"]; $safe_variable = (int)$unsafe_variable ; mysqli_query($conn, "INSERT INTO table (column) VALUES ("" . $safe_variable . "")");

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

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

بناء المصفوفات

يحتوي المصفوفة في PHP على بناء جملة ووظيفة ملائمة. يمكن وصف ذلك مسبقًا، ولكن غالبًا ما يكون من المناسب إنشاء مصفوفات بسرعة حسب الحاجة.

public $aNone = array(); // المصفوفة موصوفة ولا تحتوي على أي شيء

public $aFact = array("avocado", "peach", "cherry"); // تحتوي هذه المصفوفة على ثلاثة عناصر

إنشاء مصفوفة أثناء التحقق من الشرط:

$cSrcLine = "خط البيانات الذي تم تحليله";

لـ ($i=0; $i<13; $i++) {

إذا (checkFunc($cSrcLine، $cUserLine) (

$aResult = "نعم"; // أضف إلى مصفوفة PHP

$aResult = "لا";

نتيجة لتنفيذ هذا المثال، سيتم إنشاء مصفوفة مكونة من 13 عنصرًا، ستكون قيمها فقط السلاسل "Yes" أو "No". ستتلقى العناصر فهارسًا من 0 إلى 12. ويمكن تحقيق نفس التأثير عن طريق كتابة مصفوفة PHP "المستقبلية" أولاً في سلسلة:

$cFutureArray = "";

لـ ($i=0; $i<13; $i++) {

$cUserLine = inputUserLine(); // أدخل شيئا

إذا ($i > 0) ( $cFutureArray .= "|"; )

إذا (checkFunc($cSrcLine, $cUserLine) ( $cFutureArray .= "Yes";

) آخر ( $cFutureArray .= "لا"; )

$aResult =تفجير("|", $cFutureArray);

مصفوفات متعددة الأبعاد

تستخدم العديد من أنظمة إدارة المحتوى (CMS) المصفوفات بشكل كبير. من ناحية، هذه ممارسة جيدة، ومن ناحية أخرى، تجعل من الصعب استخدامها. حتى لو كان المؤلف يفهم مبدأ "مصفوفة PHP داخل مصفوفة"، فلا ينبغي له إساءة استخدامه: لن يتعين على المطور فقط التعود على التدوين المعقد. في كثير من الأحيان، بعد فترة من الوقت، سوف يتذكر المبدع نفسه لفترة طويلة ما كتبه في البداية:

"view_manager" => array(41, "template_path_stack" => array(__DIR__ . "/../view"،),

"جهاز التوجيه" => المصفوفة("routes" => المصفوفة("sayhello" => المصفوفة(

"اكتب" => "Zend\Mvc\Router\Http\Literal"،

"خيارات" => مصفوفة("route" => "/sayhello"، "افتراضيات" => مصفوفة(

"وحدة التحكم" => "Helloworld\Controller\Index"، "action" => "index"،)))))،

"وحدات التحكم" => المصفوفة("invocables" => المصفوفة(

"Helloworld\Controller\Index" => "Helloworld\Controller\IndexController"))

هذا مثال على ممارسة "مصفوفة PHP داخل مصفوفة" من ZF 2. لم يكن الأمر ملهمًا للغاية في البداية، لكنه يعمل ويمكن القول إنه يجعل إطار العمل هذا ناجحًا (مثال من ZendSkeletonApplication/module/Helloworld/config/module.config.php) .

المصفوفة عبارة عن بناء مهم للبيانات أثناء التصميم والتطوير. كانت نسختها متعددة الأبعاد ذات شعبية كبيرة، ولكن مع مرور الوقت ظلت هناك حاجة لمصفوفات بحد أقصى ثنائي أو ثلاثة أبعاد. الأمر أبسط وأكثر وضوحًا بهذه الطريقة، ومن وجهة نظر مهنية، عندما يبدأ شيء ما في التكاثر، فهذا يعني أن هناك خطأ ما في بيان المشكلة أو في الكود.

بسيطة ويمكن الوصول إليها ومفهومة

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

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

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

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

المصفوفات البسيطة والترابطية

تدوين المصفوفة ثنائية الأبعاد هو زوج آخر من الأقواس "[" و"]"، على سبيل المثال: $aSrcData يعني الوصول إلى عنصر المصفوفة المضمن في المصفوفة $aSrcData. ليس هناك شرط للإعلان عن البيانات مقدما في PHP. يمكن دائمًا التحقق من وجود أي معلومات معلنة.

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

$aAnketa["name"] = "إيفانوف";
$aAnketa["age"] = 42;
$aAnketa["work"] = "المخرج";
$aAnketa["active"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "بيتروف";
$aAnketa["age"] = 34;
$aAnketa["work"] = "المدير";
$aAnketa["active"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "أفاناسييف";
$aAnketa["age"] = 28;
$aAnketa["work"] = "العامل";
$aAnketa["active"] = false;
$aTable = $aAnketa;

$sOne .= ينفجر ("؛ "، $aTable) . "
"؛ // مصفوفة PHP الثانية في سلسلة
$sOne .= $aTable["work"]; // الوصول إلى عنصر واحد من المصفوفة الثانية

نتيجة هذا المثال (المصفوفة الأولى عادية، والمفاتيح الموجودة فيها تبدأ من 0، والمصفوفة الثانية ترابطية، ولها أربعة مفاتيح: "الاسم"، "العمر"، "العمل"، "النشط"):

$sOne = "بيتروف؛ 34؛ مدير؛ 1
مدير"؛

يوضح هذا المثال البسيط كيف يمكن تطبيق الاستبيان الذي تم إنشاؤه على جميع الموظفين. يمكنك إنشاء مجموعة من الموظفين مع فهارس بأرقام الموظفين، وإذا كنت بحاجة إلى موظف معين، فقم بتحديده حسب رقم الموظفين.

إذا كانت المنظمة لديها أقسام، أو لديها عمال موسميون، أو تحتاج إلى تحديد المتقاعدين العاملين بشكل منفصل، ... فإن تصميم "مصفوفة PHP في مصفوفة" مناسب للغاية، ولكن لا ينبغي عليك أبدًا الانجراف في الأبعاد. بعدان أو ثلاثة أبعاد هو الحد الأقصى للحل الفعال.

مفاتيح للعمل مع المصفوفات

إذا كان من المهم في السابق كيف تم ترتيب كل شيء، ففي السنوات الأخيرة، تم نسيان تقاليد العصر الثنائي، عندما أراد المبرمج معرفة كيفية تخزين عناصر المصفوفة بالضبط وأراد الوصول إليها بشكل مباشر، وقد تم نسيانها تمامًا. ظهرت العديد من ترميزات الأحرف التي تشغل أكثر من بايت واحد في الذاكرة. يمكن الآن العثور على كلمة "bit" فقط في عمليات البحث عن البتات، ولكن البحث في مصفوفة PHP يعد موضوعًا منفصلاً. يمكن أن يكون الوصول إلى العناصر بسيطًا وترابطيًا. في الحالة الأولى، تكون عناصر المصفوفة (التي تحتوي على أي من الأنواع المتوفرة في PHP) مرقمة 0، 1، 2، ... وفي الحالة الثانية، يحدد المبرمج فهرسه الخاص، والذي يسمى غالبًا "المفتاح"، للوصول إلى القيمة المطلوبة.

$aLine["fruit"] = "برتقالي"; // هنا مفتاح صفيف PHP = "الفاكهة"

أو (بحيث يكون كل شيء صحيحًا، مع احترام ترميز الصفحة ورمزها):

$aLine = iconv("UTF-8", "CP1251", "orange");

عند إضافة قيمة جديدة إلى المصفوفة $aLine:

$aLine = iconv("UTF-8", "CP1251", "peach");
$aLine = iconv("UTF-8", "CP1251", "cucumber");
$aLine = iconv("UTF-8", "CP1251", "eggplant");

نتيجة لتنفيذ الحلقة:

foreach ($aLine كـ $ck => $cv) (
$cOne .= $ck . "= . $ السيرة الذاتية . "
";
}

سيتم استلام:

الفاكهة = البرتقال
0=خوخ
الخضار=الخيار
1=باذنجان

يتم تشكيل مفتاح صفيف PHP عند إضافة عنصري "الخوخ" و"الباذنجان" بالتتابع من 0، وعند تحديد قيمته سيكون مساويًا لهذه القيمة.

إزالة العناصر من المصفوفة

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

يمكن أن يكون أسهل. إذا طبقنا على المثال الأخير:

غير محدد($aLine); // إزالة عنصر المصفوفة PHP

ثم ستكون النتيجة:

الفاكهة = البرتقال
الخضار=الخيار
1=باذنجان

هناك العديد من الخيارات لمعالجة عناصر المصفوفة. على سبيل المثال، باستخدام الدالتين: Iplode() و Explode()، يمكنك كتابة مصفوفة PHP في سلسلة بمحدد واحد، ثم تحليلها مرة أخرى إلى مصفوفة أخرى باستخدام محدد مختلف.

لحذف مصفوفة كاملة في PHP، فقط اكتب: unset($aLine);

هذا يكفي.

البحث في مصفوفة

تحتوي لغة PHP على وظائف بحث خاصة ووظائف in_array()، ولكن قبل أن تقرر استخدامها، يجب أن تفكر في إجراء عمليات بحث عن مصفوفات PHP بنفسك.

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

في PHP، يمكنك استدعاء الوظائف التي يتم تحديد اسمها أثناء تنفيذ البرنامج. مثال عملي جدًا من مكتبة PHPWord، والذي يسمح لك بقراءة وإنشاء مستندات MS Word:

$elements = array("Text"، "Inline"، "TextRun"، "Link"، "PreserveText"، "TextBreak"،
"ListItem"، "ListItemRun"، "جدول"، "صورة"، "كائن"، "حاشية سفلية"،
"التعليق الختامي"، "مربع الاختيار"، "مربع النص"، "الحقل"، "الخط")؛

$functions = array();

لـ ($i = 0؛ $i< count($elements); $i++) {
$functions[$i] = "أضف" . $elements[$i];
}

ونتيجة لذلك، ستتلقى مصفوفة $functions قيم مصفوفة $elements، أي أسماء الوظائف الحقيقية التي تعمل مع عناصر مستند حقيقية.

من خلال استدعاء الدالة $functions على $elements، يمكنك الحصول على بحث مثالي ونتائج سريعة.

فرز العناصر

مهمة فرز البيانات مهمة وتوفر PHP عدة وظائف لهذا:sort(), rsort(), asort(), ksort(), ... عناصر تصاعدية وتنازلية، والوظيفتان الثانيتان تخزنان العلاقات بين المفاتيح والقيم . في بعض الأحيان يكون من المنطقي خلط قيم المصفوفة بشكل عشوائي - shuffle().

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

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

مصفوفات السلسلة

بفضل الدالتين implode() و Explode()، يمكن تحويل المصفوفة بسهولة إلى سلسلة وإعادتها مرة أخرى. يتيح لك ذلك تخزين البيانات في تمثيل مضغوط وتوسيعها إلى حالة مناسبة حسب الحاجة.

تفتح المصفوفة المحولة إلى سلسلة إمكانيات جديدة. على سبيل المثال، تتطلب مهمة البحث عن الكلمات الرئيسية في النص عدم إضافة ما يتم العثور عليه مرة أخرى.

$cSrcLine = "Text Text ListItemRun TextBox ListItem TextBox Check Box CheckBox TextBox Footnote";

$aSrc = تنفجر(" ", $cSrcLine);
$cDstLine = "";

لـ ($i=0; $i< count($aSrc); $i++) {
$cFind = "[" . $aSrc[$i] . "]";
إذا (! is_integer(strpos($cDstLine, $cFind))) (
$cDstLine .= $cFind;
}
}
$aDst = تنفجر("]["، $cDstLine);

$cOne = Iplode("; ", $aDst);

نتيجة لذلك، سيتلقى المتغير $cOne فقط تلك القيم من السلسلة المصدر التي تظهر هناك مرة واحدة: "Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Footnote".

اللغة الروسية في المفاتيح والمعاني

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

PHP هي لغة مخلصة ومتسامحة مع الترميزات الوطنية، ولكن هناك العديد من المواقف التي يجب فيها تنفيذ كمية العمل المكتملة مرة أخرى فقط لأن قيمة المفتاح تظهر في المكان المناسب وفي الوقت المناسب، وهو أمر غير ممكن يتعرف على.

PHP بناء الجملة وبيئة اللغة

يجب أن نتذكر أن بناء جملة PHP هو شيء واحد، ولكن بنيات بناء الجملة هذه "تتعامل" مع التطبيقات الأخرى، مع نظام التشغيل، مع خيارات الأجهزة. هناك العديد من الخيارات، وليس من الممكن أبدا توفير كل شيء.

القاعدة "لا يوجد سوى رمز في الكود، ولكن هناك كل أنواع المعلومات عند الإدخال والداخل والإخراج" ستساعد في تجنب المفاجآت غير المتوقعة. يمكن أن تكون قيمة PHP في المصفوفة "روسية"، لكن مفتاحها يجب أن يكون صحيحًا من الناحية النحوية ليس فقط من وجهة نظر اللغة المحددة، ولكن أيضًا من وجهة نظر بيئة التشغيل الخاصة بها.