2017-06-28 8 views
1

Ich debugge meine PHP-Fehler-Logs, um Hinweise, Warnungen und Fehler zu finden, die ich verpasst habe. Jetzt benutze ich die php array_rand() Funktion, um 1 Element eines Arrays zu erhalten. Unter normalen Umständen funktioniert das ohne Probleme, aber in meinen PHP-Fehlerprotokollen gibt es einige Warnungen bezüglich des Codes unter Verwendung von array_rand().PHP array_rand() löst Warnung aus Ich erwarte nicht

PHP Warning: array_rand(): Second argument has to be between 1 and the number of elements in the array in ...

Ich verwende array_rand() in etwa so aus:

$arr = 
    [ 
     3 => [ 
      999 => "10-G2", 
      1366 => "11-B2", 
      1481 => "14-C3", 
     ] 
    ]; 

$randomLoc = array_rand($arr[3], 1); 

Dies kehrt mich 999, 1366 oder 1481. Wenn dieses Array leer ist,

Wenn $arr[3] emtpy ist, wird es eine leere Warnung

Warning: array_rand(): Array is empty in

Wenn $arr[3] nicht isset, werfen sie eine undefined Offset Ankündigung vor der Warnung werfen

Notice: Undefined offset: 3 in

Also, wie ist es möglich, ein zweites Argument zu bekommen muss zwischen 1 und ... Warnung ohne die undefinierte Offset-Meldung sein?

Antwort

2

Am wahrscheinlichsten ist es, weil Ihr Array nicht enthält, was Sie denken, dass es enthält. Zum Beispiel gibt dieses Array Sie diesen Fehler:

$arr = 
    [ 
     3 => [] 
    ]; 

$randomLoc = array_rand($arr[3], 1); 

Auch wenn ich eine allgemeinere Vorschlag machen können, sollten Sie nicht über Ihre Log-Dateien zu suchen, um diese Dinge zu finden. In Ihrer Entwicklungsumgebung sollte Ihr System aktiv sagen, ob etwas kaputt ist. In meinem Fall stoppt die Ausführung des Skripts und gibt ein Backtrace auf dem Bildschirm mit der Fehlermeldung any Fehler: Fatals, nicht abgefangene Ausnahmen, Fehler und Hinweise.

Edit:

Sie sagte:

If $arr[3] is emtpy, it will throw an empty warning

Das ist nicht wahr. Das kann von der Version abhängen: Ich bin mit array_rand nicht besonders vertraut. Meine eigenen Tests zeigen, dass dies:

$arr = []; 
$val = array_rand($arr); 

mit $val Satz enden auf null. Dies:

$arr = []; 
$val = array_rand($arr, 1); 

löst genau den Fehler, den Sie erhalten:

PHP Warning: array_rand(): Second argument has to be between 1 and the number of elements in the array in ...

In keinem Fall kann ich eine Fehlermeldung über ein leeres Array erhalten. Ich benutze PHP 7.0.

+0

Lokal verwende ich PHP 7.1 und warne eine leere Warnung. PHP 7.0 wirft tatsächlich und das zweite Argument muss zwischen 1 .. Warnung liegen. Und da ist mein fuckup, Fehlerprotokoll ist aus PHP 7.0 (Produktion) und meine Entwicklungsumgebung ist schon auf PHP 7.1 – Timo002

+0

Interessant. Ich habe das Änderungsprotokoll für die Funktion array_rand im PHP-Handbuch überprüft und diese Änderung in der Warnmeldung nicht erwähnt. Die tatsächliche Warnmeldung wird ebenfalls nicht erwähnt. Es erwähnt zwar Änderungen in PHP 7.1, hat aber nichts damit zu tun: Es ist seltsam, dass dieses "Feature" nicht dokumentiert ist. –

0

$randomLoc = isset($arr[3]) && !empty($arr[3]) ? array_rand($arr[3], 1) : null wird null Wert zurückgegeben, wenn $ arr nicht festgelegt oder leer ist.

Außerdem müssen Sie nicht in Ihren Protokolldateien suchen, um diese Fehler zu finden. Ihre Entwicklungsumgebung sollte Benachrichtigungen & Warnungen anzeigen.Hier einige weitere Informationen über die Fehlerberichterstattung: http://php.net/manual/fr/function.error-reporting.php

0

So, how is it possible to get a Second argument has to be between 1 and... warning without the undefined offset notice?

Es ist nicht, aber das ist ok, weil Sie nicht möchten, dass entweder zu warnen. Stellt sicher, dass Sie eine gültige Array haben, bevor er es array_rand():

if (
    is_array($arr) && 
    array_key_exists(3, $arr) && 
    is_array($arr[3]) && 
    !empty($arr[3]) 
) { 
    $randomLoc = array_rand($arr[3]); 
} else { 
    $randomLoc = null; // or throw an error? 
} 

Wenn Sie PHP7 + verwenden, können Sie die neue ?? Operator kann das gleiche in einem Schuss zu tun:

$randomLoc = array_rand($arr[3] ?? [null]);