بحث PHP في مجموعة النقابي حسب القيمة. PHP: array_search - بحث سريع من خلال صفيف. العثور على قيمة في مصفوفة متعددة الأبعاد

23.10.2023

(PHP 4 >= 4.0.5، PHP 5)

array_search - يقوم بالبحث قيمة معينةفي صفيف ويعيد المفتاح المقابل في حالة نجاحه

وصف

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

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

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

تعليق:ما يصل إلى PHP 4.2.0، array_search()عاد إذا لم ينجح باطلبدلاً من خطأ شنيع .

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

إذا كانت الإبرة موجودة في كومة القش أكثر من مرة، فسيتم إرجاع المفتاح الأول الذي تم العثور عليه. لإرجاع المفاتيح لجميع القيم التي تم العثور عليها، استخدم الدالة صفيف_مفاتيح()باستخدام معلمة search_value الاختيارية.


مثال 1: مثال الاستخدام array_search()

$array = array(0 => "blue" , ​​​​1 => "red" , 2 => 0x000000 , 3 => "green" , 4 => "red" );$key = array_search ("red" , $صفيف); // مفتاح $ = 1؛
$key = array_search("green" , $array ); // مفتاح $ = 2; (0x000000 == 0 == "أخضر")
$key = array_search ("green" , $array , true ); // مفتاح $ = 3؛
?>
انتباه

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

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

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

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

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

اليوم سوف ننظر إليهم.

التحقق من وجود قيمة في المصفوفة. وظيفة in_array()

وظيفة in_array()سيسمح لنا بالتحقق من وجود أي قيمة في المصفوفة.

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

تأخذ الوظيفة معلمتين مطلوبتين:<Что ищем>و<Где ищем>.

يمكن أن يستغرق أيضًا معلمة اختيارية أخرى:<Тип данных>. إذا تم تعيين هذه المعلمة الاختيارية الثالثة على حقيقي، ثم يتم التحقق من نوع البيانات أيضًا. وهذا يعني أن "2" و2 لن يكونا نفس الشيء. في الحالة الأولى يكون رقمًا، وفي الحالة الثانية يكون رقمًا. ومن ثم الوظيفة بأكملها in_array()لن يعود قيمة حقيقي.

عليك أيضًا أن تتذكر أن الوظيفة تجري مقارنات حساسة لحالة الأحرف.

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

بعد التنفيذ، ستعرض الدالة الرسالة "نعم"، نظرًا لوجود عنصر "مارينا" في مصفوفتنا.

قم بتغيير المعلمة الأولى في الدالة إلى عنصر غير موجود، وسترى الرسالة "لا".

التحقق من وجود قيمة في المصفوفة. وظيفة array_search()

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

تأخذ الوظيفة نفس المعلمات مثل الوظيفة السابقة. في هذه الحالة، المعلمة الثالثة اختيارية أيضًا.

دعونا نرى كيف يمكن استخدامه عند العمل مع مصفوفة ترابطية.

"أكتوبر"، "المال" => 200، "اسم" => "ميلة")؛ $key = array_search("ميلة",$Mass1); إذا($key) صدى $key؛ ?>

في هذه الحالة، سنرى على الشاشة "الاسم"، أي مفتاح العنصر المطلوب بقيمة "ميلة".

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

العثور على قيمة في مصفوفة متعددة الأبعاد

ولكن ماذا لو كنا نعمل مع مجموعة متعددة الأبعاد؟ بعد كل شيء، ستكون عناصره صفائف أخرى.

هنا لن تعمل الخوارزميات التي ناقشناها بالفعل.

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

لنفترض أن لدينا مجموعة متعددة الأبعاد. قيمها المباشرة هي صفائف أخرى قد تحتوي على القيمة المطلوبة للعنصر.

كل ما عليك فعله هو تكرار عناصر المصفوفة الأصلية foreach(). سيتم تحليل كل عنصر من عناصر هذه المصفوفة إلى مفتاح ($key) وقيمة ($value).

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

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

دعونا نرى كل هذا مع رمز المثال:

"آنا"، "المعرف" => 234)؛ $Mass2 = array("name"=>"anton"،"id"=>24); $Mass2 = array("name"=>"ivan"،"id"=>007); foreach($Mass2 as $key => $value) ( ​​​​$name .= in_array("ivan",$value); ) if($name) echo "OK! العنصر هنا!"; else echo "لا يوجد عنصر!"; ?>

كما ترون، أولا نعلن عن المصفوفة متعددة الأبعاد نفسها.

علاوة على ذلك، هنا يجب عليك ألا تكتب علامة المساواة فحسب، بل ".=".

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

كما تفهم، ستكون نتيجة هذا الرمز هي الرسالة "موافق! العنصر هنا!

حاول تغيير العنصر الذي تبحث عنه إلى عنصر غير موجود وستظهر لك الرسالة "لا يوجد عنصر!"

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

هذا كل شيء لهذا اليوم! أتمنى أن الدرس كان واضحا ومفيدا! حاول كتابة كود مماثل بنفسك لفهم كل شيء بشكل كامل.

وأنا في انتظار تعليقاتكم.

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

أتمنى لك برمجة ناجحة!

كانت آنا كوتيلنيكوفا معك!

لقد كنت أستخدم وظيفة 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 ثانية