PHP - أحسب علة (ربما / جزئيا) ولكن لا يزال لا أعرف كيفية إصلاحه - كيفية التعبير عن ألفا نطاق رقمي

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

  •  27-10-2019
  •  | 
  •  

سؤال

لدي هذا رمز PHP:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));

$i = 0;
while ($i <= 5) {
    $var .= $char[rand(0,68)];
    $i++;
}

echo $var;

في لمحة ينبغي أن تولد 6 حرف اللدغة (مثل:eVx97j).

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

أنا تقريبا متأكد من ذلك لأن من هذا:

(يمكن أن يكون أن تفعل شيئا مع هذه المشكلة)

  [50]=>
  string(1) "Y"
  [51]=>
  string(1) "Z"
  [52]=>
  int(0)
  [53]=>
  int(1)
  [54]=>
  int(2)

ترى الفرق ؟

ما يحيرني هو أن المدونة لا توليد سلسلة مع الأرقام.

لذلك يمكنك بقعة علة ؟

هل هذا هو الطريق الصحيح في PHP للتعبير عن a-z A-Z + 0-9 الشخصيات ؟

شكرا مقدما!!

يرجى طلب أي توضيح حاجة!


راجع للشغل:لقد حاولت أيضا: $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

هل كانت مفيدة؟

المحلول

rand(0,68)

أنا فقط عد 62 عنصرا في مجموعة:

A-Z (26)
a-z (26)
0-9 (10)
    ----
     62

ربما الرياضيات ؟ (حتى ideone يظهر مؤشرات 0-61 ;-p)

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

نصائح أخرى

بلدي التوصية التالية:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pool = str_split($chars, 1);
$max = count($pool) - 1;

$random = '';
for ($i = 1; $i <= 5; $i ++) {
    $random .= $pool[mt_rand(0, $max)];
}

echo $random;

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

هذا هو في الواقع الى حد كبير مباشرة من Kohana الأساسية: https://github.com/kohana/core/blob/3.0/develop/classes/kohana/text.php#L140 أنها توفر مجموعة متنوعة من مجموعات من الشخصيات مما يسمح لمختلف مجموعات عشوائية ، بما في ذلك متميزة وهو أمر مفيد جدا من أجل توليد كلمة السر.

المشكلة هي في rand(0,68) لأن الأبجدية قد 62 شخصيات 68.لذلك عندما rand يعود الصحيحه 63 إلى 67 سلسلة فارغة يتم إلحاق $var, ، مما أدى إلى أقصر سلسلة من 5 أحرف (أو حتى أقل من ذلك إذا كنت "محظوظا بما فيه الكفاية").

على أي حال, أعتقد أنه أكثر وضوحا إذا كنت تستخدم فقط array_rand:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
for ($i = 0; $i < 6; $i++) {
    $var .= $char[array_rand($char)];
}
echo $var;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top