Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

explode()をすると配列が全てstringになってしまう

Q&A

解決したいこと

explode()を使うと数値型integerの配列にしたいのに、配列が全て文字型stringになってしまう

例)

発生している問題・エラー

例えば、

85 -46 93 44 -40 -75 -75 -18 -54 95

という数字が与えられていたとして、

$A = explode(" ",trim(fgets(STDIN)));

というように取得して、

var_dump($A);

をすると配列が全て文字型stringになってしまいます。
与えられた数字を取得したとき、取得した値が数字だった場合、全て数値型integerである方が後々要素を計算に使うときに楽なような気がします。
・文字型のままで良いのであれば、その理由をお聞きしたいのと、
・もし数値型に直した方が良いのであればそのやり方を教えていただきたいです。

0

2Answer

PHPのexplodeは文字列を分割する関数ですので結果は文字列の配列になります。
文字列のままでも数値の文脈で使われれば数値に自動的に変換されますので、あまり気にしなくても大丈夫です。
参考:PHP: 数値形式の文字列 - Manual
でもパフォーマンスが気になるなどでやはり数値に変換しておきたいなら、foreachなどで地味に1つずつ変換するしかないと思います。
参考:【php】配列の要素をまとめて数値に変換する at softelメモ

2Like

Comments

  1. @voyce_sakamoto

    Questioner

    なるほど!それで変換する必要がないんですね!
    わかりやすい説明ありがとうございます。

型安全にやるならこうです。ただし、意図しない形式の入力はない前提です。

$A = array_map(fn($n): int => $n, explode(' ', trim(fgets(STDIN))));

↑ のコードはPHPの型宣言を悪用しているので、 declare(strict_types=1) の環境では動きません。


以下のように書くこともできますが、意図しない形式の入力は0に化けてしまいます。

$A = array_map('intval', explode(' ', trim(fgets(STDIN))));

型が array<int> ではなく array<int|false> になって構わないのなら、こうです。

$A = array_map(fn($n) => filter_var($n, FILTER_VALIDATE_INT), explode(' ', trim(fgets(STDIN))));

コード量はちょっとだけ増えますが、不正な入力は false になります。

1Like

Your answer might help someone💌