web-dev-qa-db-ja.com

php explode()使用時の未定義のオフセット

名前を姓と名に分割するためのphp explode()関数の非常に単純な使用であると私が思ったことを書きました:

// split name into first and last
$split = explode(' ', $fullname, 2);
$first = $split[0];
$last = $split[1];

ただし、これにより"Undefined offset: 1"というメッセージとともにphpエラーがスローされます。関数はまだ機能しているようですが、エラーの原因を取り除きたいと思います。 php manual を確認しましたが、これらの例では上記と同じ構文を使用しています。私は未定義のオフセットが何であるかを理解していると思いますが、コードがエラーを生成している理由がわかりません!

17
musoNic80

これは、フルネームにスペースが含まれていないためです。簡単なトリックを使用して、スペースが常にどこにあるかを確認できます

 $split = explode(' ', "$fullname ");

(引用符内のスペースに注意してください)

ところで、list()関数を使用してコードを簡略化できます

  list($first, $last) = explode(' ', "$fullname ");
39
user187291

これは、$fullnameにスペース文字が含まれていないことが原因である可能性があります。

この例では、この通知を表示せずに問題を修正する必要があります。

$split = explode(' ', $fullname, 2);
$first = @$split[0];
$last = @$split[1];

$fullname"musoNic80"の場合、通知メッセージは表示されません。

"@"文字の使用に注意してください。

HTHエリアス

4

ところで、そのアルゴリズムは常に機能するとは限りません。 「De Castro」、「Dela Cruz」、「La Rosa」などの2語のラティーナまたはイタリア語の姓の名前を考えてみてください。Splitは2語ではなく3語を返します。

Array {
  [0] => 'Pedro'
  [1] => 'De'
  [1] => 'Castro'
}

「Welcome back Ana De」や「Editing Profile of Monsour La」などのメッセージが表示されます。

「アンマリーミラー」、「ウィリアムハワードタフト」などの2語の名前でも同じことが起こります。

ほんのヒント。

4

$split = array_pad(explode(' ', $fullname), 2, null);

  • explodeは、文字列を制限なく配列に分割します。
  • array_padのエントリがarray_pad未満の場合、2は分解された配列にnullの値を入力します。

array_pad を参照

3
ph.dev

おそらく、何でも$fullnameにはスペースが含まれないため、$splitは単一の要素を含む配列なので、$split[1]は未定義のオフセットを指します。

2
Dominic Rodger

_array_pad_は、このスレッドで唯一有効な回答です。他のすべては、あなたの顔に爆発する可能性がある醜いハックです。 _array_pad_を使用すると、要素の量が正しく入力されていることを常に確認できます。 list()タイプの出力で使用する場合は特に重要です。

奇妙なことですが、ここでは正しく機能しています。文字列the cat walksだけでなく、theを使用してもエラーは発生しません。 print_rで出力しました

エラーが発生した場合、$fullnameはどのように見えますか?

0
Ben Fransen