2017-06-28 11 views
1

私が逃した通知、警告、エラーを見つけるためにPHPのerror_logsをデバッグしています。今私は配列の1要素を取得するためにPHP array_rand()関数を使用しています。通常の状況ではこれは問題なく動作しますが、私のPHPエラーログには、array_rand()を使ってコードに関するいくつかの警告があります。PHP array_rand()throws予期しない警告

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

私はこのようにarray_rand()を使用しています:

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

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

これは私に9991366または1481を返します。この配列が空の場合ISSETない

Warning: array_rand(): Array is empty in

$arr[3]場合、$arr[3]がemtpyある

場合、それは警告

Notice: Undefined offset: 3 in

前に、未定義のオフセットの通知がスローされます、空の警告がスローされますだから、どのように入手することが可能です2番目の引数は1と...未定義のオフセット通知なしで警告する必要がありますか?

答えて

2

おそらく、あなたの配列には、それが含まれていると思われるものが配列に含まれていない可能性があります。また

$arr = 
    [ 
     3 => [] 
    ]; 

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

私はより一般的な提案をすることができれば、あなたはこれらの事を見つけるためにあなたのログファイルに目を通す必要はありません。たとえば、この配列はあなたにそのエラーを与えるだろう。あなたの開発環境では、システムが何か壊れているかどうかを積極的に伝える必要があります。私のケースでは、スクリプトの実行が停止し、のエラーメッセージであるというエラー(致命的、未捕捉例外、エラー、および通知)の画面にバックトレースが表示されます。

編集:

あなたは言った:

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

これは真実ではありません。バージョンに依存するかもしれません:私はarray_randに精通していません。

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

nullに$valセットで終了します:私自身のテストでは、これがあることを示しています。この:

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

をいかなる場合にも、私は空の配列に関するエラーが出るん:

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

は正確にあなたが受けているエラーがトリガされます。私はPHP 7.0を使用しています。

+0

ローカル私は空の警告を投げ、PHP 7.1を使用しています。 PHP 7.0は本当に投げているし、第二引数は1 ..警告の間にある必要があります。そして、私のfuckupがあります。エラーログはPHP 7.0(プロダクション)からのもので、私の開発環境はすでにPHP 7.1です。 – Timo002

+0

興味深い。私はPHPマニュアルのarray_rand関数の変更ログをチェックしましたが、警告メッセージでこの変更については言及していませんでした。実際の警告メッセージについては言及していません。 PHP 7.1での変更については言及していますが、これとは関係ありません。この「機能」がドキュメント化されていないのは変です。 –

0

$randomLoc = isset($arr[3]) && !empty($arr[3]) ? array_rand($arr[3], 1) : null は、$ arrが設定されていないか空の場合はnullの値を返します。

さらに、これらのエラーを見つけるためにログファイルにgrepする必要はありません。開発環境には、通知&の警告が表示されます。ここではエラー報告に関するいくつかのより多くの情報があります: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?

あなたはどちらかという警告をしたくないので、それはないのですが、それは大丈夫です。ただ、それは)(array_randに渡す前に、有効な配列を持っていることを確認してください。

$randomLoc = array_rand($arr[3] ?? [null]); 
:あなたはPHP7 +を使用している場合

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? 
} 

は、あなたが一発で同じことを行うために新しい??演算子を使用することができます

関連する問題