فهرسة مصفوفة PHP:$array[$index] vs $array["$index"] مقابل $array["{$index}"]

StackOverflow https://stackoverflow.com/questions/6628

  •  08-06-2019
  •  | 
  •  

سؤال

ما هو الفرق، إن وجد، بين طرق الفهرسة في مصفوفة PHP:

$array[$index]
$array["$index"]
$array["{$index}"]

أنا مهتم بكل من الأداء والاختلافات الوظيفية.

تحديث:

(ردًا على @Jeremy) لست متأكدًا من أن هذا صحيح.قمت بتشغيل هذا الكود:

  $array = array(100, 200, 300);
  print_r($array);
  $idx = 0;
  $array[$idx] = 123;
  print_r($array);
  $array["$idx"] = 456;
  print_r($array);
  $array["{$idx}"] = 789;
  print_r($array);

وحصلت على هذا الإخراج:

Array
(
    [0] => 100
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 123
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 456
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 789
    [1] => 200
    [2] => 300
)
هل كانت مفيدة؟

المحلول

راجعsvec وjeremy أعلاه.جميع فهارس المصفوفات من النوع "int" أولاً، ثم اكتب "string"، وسيتم تحويلها إلى ما تراه PHP مناسبًا.

من ناحية الأداء، يجب أن يكون $index أسرع من "$index" و"{$index}" (وهما نفس الشيء).

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

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

نصائح أخرى

لقد قمت بتوقيت الطرق الثلاث لاستخدام فهرس مثل هذا:

for ($ii = 0; $ii < 1000000; $ii++) {
   // TEST 1
   $array[$idx] = $ii;
   // TEST 2
   $array["$idx"] = $ii;
   // TEST 3
   $array["{$idx}"] = $ii;
}

المجموعة الأولى من الاختبارات المستخدمة $idx=0, ، المجموعة الثانية مستخدمة $idx="0", ، واستخدمت المجموعة الثالثة $idx="blah".تم التوقيت باستخدام microtime() يختلف.أنا أستخدم WinXP وPHP 5.2 وApache 2.2 وVim.:-)

وهنا النتائج:

استخدام $idx = 0

$array[$idx]            // time: 0.45435905456543 seconds
$array["$idx"]          // time: 1.0537171363831 seconds
$array["{$idx}"]        // time: 1.0621709823608 seconds
ratio "$idx" / $idx     // 2.3191287282497
ratio "{$idx}" / $idx   // 2.3377348193858

استخدام $idx = "0"

$array[$idx]            // time: 0.5107250213623 seconds
$array["$idx"]          // time: 0.77445602416992 seconds
$array["{$idx}"]        // time: 0.77329802513123 seconds
ratio "$idx" / $idx     // = 1.5163855142717
ratio "{$idx}" / $idx   // = 1.5141181512285

استخدام $idx = "blah"

$array[$idx]           // time: 0.48077392578125 seconds
$array["$idx"]         // time: 0.73676419258118 seconds
$array["{$idx}"]       // time: 0.71499705314636 seconds
ratio "$idx" / $idx    // = 1.5324545551923
ratio "{$idx}" / $idx  // = 1.4871793473086

لذا $array[$idx] هو الفائز في مسابقة الأداء، على الأقل على جهازي.(كانت النتائج متكررة للغاية، راجع للشغل، قمت بتشغيلها 3 أو 4 مرات وحصلت على نفس النتائج.)

أعتقد من منظور الأداء أن $ array ["$ index"] أسرع من $ array [$ index] راجع أفضل الممارسات لتحسين أداء رمز PHP

لا تصدق كل ما تقرأه بشكل أعمى..أعتقد أنك أخطأت في تفسير ذلك.تقول المقالة أن $array['index'] أسرع من $array[index] حيث يكون الفهرس a خيط, ، وليس متغيرا.هذا لأنه إذا لم تقم بتغليفه بين علامتي اقتباس، فإن PHP تبحث عن متغير ثابت ولا يمكنها العثور عليه، لذا تفترض أنك تقصد جعله سلسلة.

متى ستتوافق طرق الفهرسة المختلفة مع مؤشرات مختلفة؟

وفق http://php.net/types.array, ، يمكن أن يكون فهرس المصفوفة عددًا صحيحًا أو سلسلة فقط.إذا حاولت استخدام عدد عائم كمؤشر، فسيتم اقتطاعه إلى عدد صحيح.حتى إذا $index هو تعويم بقيمة 3.14، إذن $array[$index] سيتم تقييم ل $array[3] و $array["$index"] سيتم تقييم ل $array['3.14'].إليك بعض التعليمات البرمجية التي تؤكد ذلك:

$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);

$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";

الإخراج:

Array([3] => float [3.14] => string)
float
string

الرد على التحديث:

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

$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);

وكان الناتج:

Array([1] => 300 [2] => 400)

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

ejunker:

هل يمكنك شرح لماذا هذا أسرع؟ألا يتطلب الأمر من المترجم خطوة إضافية لتحليل "$index" في السلسلة لاستخدامه كمؤشر بدلاً من استخدام $index فقط كمؤشر؟

إذا كان $index عبارة عن سلسلة، فلا يوجد فرق لأن $index و"$index" و"{$index}" جميعها يتم تقييمها بنفس السلسلة.إذا كان $index رقمًا، على سبيل المثال 10، فسيتم تقييم السطر الأول إلى $array[10] وسيتم تقييم السطرين الآخرين إلى $array["10"] وهو عنصر مختلف عن $array[10].

أعتقد من منظور الأداء أن $array["$index"] أسرع من $array[$index] انظر أفضل الممارسات لتحسين أداء كود PHP

الاختلاف الآخر الذي أستخدمه أحيانًا عندما يكون لدي مصفوفة داخل سلسلة هو:

$str = "this is my string {$array["$index"]}";

يحرر:ما قصدته أن أقول هو أن $row['id'] أسرع من $row[id]

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top