回答受付が終了しました

PHPで効率よく文字列の最初の数字だけ抽出する方法

PHP39閲覧xmlns="http://www.w3.org/2000/svg">50

回答(4件)

0

> 桁数が違っていたり、なかったりします 数字が無い場合もという事は、intval()では、'0abc' と 'abc' の区別がつかないので問題では? >shimixさん > もっと効率的な処理があれば 僕だったら、ID*******公**開*さん の様にに正規表現を使うと思います。 ただ、よく考えてみると1文字でも英字が出てきたらその後は何でも良いはずなので、英字が1文字以上ある事も、末尾まで続く事も、期待する必要は無さそうに思いました。 __なので [a-zA-Z].* こんな感じでもOKだろうと > 1万行くらいなら、そこまで変わらない気がしますが・・・? > 実際の秒数ってどれくらいかかってます? チョッと調べてみました >藍ジガバチさん テキトーな乱数を先頭にくっつけた文字列(もちろん数字が無い場合もあり)を皆さんの方法で実験してみました。 10万回ループで 質問者さんのやっただろう方法の場合、0.099300861358643 秒 intval() の場合、0.028139114379883 秒 preg_match()の場合、0.057772874832153 秒 (正規表現の別解として)preg_split()の場合、0.050205945968628 秒 質問者さんのとはモノが違うので単純比較はできませんが、正規表現でも倍くらい速そうな感じですね。 > PHPのタイムアウトって、デフォルトで10秒くらい デフォルトは 30秒ですね。 (参考) ホスト機 Windows10 Core(TM) i5-9600K CPU @ 3.70GHz で実行している WSL2上の Debian10.9/PHP7.4

intval()の場合は、上でも指摘した様に '0abc' も 'abc' も 0 になってしまうので、先頭が数値(あるいは数値表現文字列)かをチェックするのを付加したら intval() & is_numeric() の場合、0.043907880783081 秒 preg_match() の場合、0.057018041610718 秒 となって、あまり優位性は無さそうですね。

0

私なら、多分こう書くかな・・・ $arr = ['1Apple25', '24Orange520', '259Orange024', 'Orange2592']; $out= []; foreach ($arr as $var) $out[] = intval($var); 文字列で得たいなら foreach を $arr = ['1Apple25', '24Orange520', '259Orange024', 'Orange2592']; $out= []; foreach ($arr as $var) $out[] = sprintf("%d", $var);

0

正規表現は覚えておくと損はないけど、遅いというイメージがあるので、文字処理は、雑に一文字づつループしちゃったほうが、早いイメージがありますね。 なので、基本線はそれでいいかと思います。 1万行くらいなら、そこまで変わらない気がしますが・・・? 実際の秒数ってどれくらいかかってます? PHPだと、タイムアウトになり、処理が全部終わらない感じですかね? 確か、PHPのタイムアウトって、デフォルトで10秒くらいだった気がしますが。(サーバによって違うかと思いますが。 なら、Javaに処理を丸投げるとか、C言語とかでやり方は変わらないけどポインタを使うとか、PHPだけど処理を分割するとかかな? やり方によっては、JavaScriptの方が早くなるケースもあるかと思いますが。 まぁ、必要に迫られて高速化しなければいけないのなら、色々と実験するしかないですね。 必要に迫られないのなら、今のままで良いかと思います。 まぁ、今動いているものは、理想を求めるのも、どうかとは思いますが、理想は求めたくなるよね。(苦笑 ケースによっては、完全な最適解は諦めて、確率的に分布を調べて、確率的に処理するとか。 例えば、簡単なケースだと最初の3が数字であるケースが事前調査で多い場合は、いきなり4つめが数字かどうかを判断し、数字ならそれ以降、数字じゃないならそれ以前を調べる・・・みたいなことをすると、1、2文字目の処理を省くことが多くできれば、処理時間が短くなる・・・みたいなことは起こるかと。 何を持って効率的か?どこまでコストをかけるか?にもよるかと思います。

0

<?php $hoge = "123Apple14"; preg_match('/^(?P<number>[0-9]+)[a-zA-Z]+.*$/', $hoge, $m); echo $m['number']; こんな感じかな 二行目は正規表現というものなので勉強してください phpに限らずどの言語でも使うので勉強しておいて損はないです