回答:
次のコードでこれを実現できます。
$integerIDs = array_map('intval', explode(',', $string));
これは、ほぼ3倍の速さよりもexplode()
、array_map()
とintval()
。
$integerIDs = json_decode('[' . $string . ']', true);
そのため、多数の整数に対する回答で言及されているいくつかのメソッドのパフォーマンスに興味がありました。
0から100までの100万のランダムな整数の配列を作成するだけです。それよりも、文字列を取得するためにそれらを内破しました。
$integers = array();
for ($i = 0; $i < 1000000; $i++) {
$integers[] = rand(0, 100);
}
$long_string = implode(',', $integers);
これは、Markの回答の1つのライナーです。
$integerIDs = array_map('intval', explode(',', $long_string));
これはJSONアプローチです:
$integerIDs = json_decode('[' . $long_string . ']', true);
私はこれをマークの答えの修正として思いつきました。これはまだexplode()
関数を使用していますが、呼び出す代わりに、array_map()
通常のforeach
ループを使用して、オーバーヘッドを回避するための作業を行っarray_map()
ています。また、(int)
vs intval()
で解析していますが、両方を試しましたが、パフォーマンスの点でそれほど違いはありません。
$result_array = array();
$strings_array = explode(',', $long_string);
foreach ($strings_array as $each_number) {
$result_array[] = (int) $each_number;
}
結果:
Method 1 Method 2 Method 3
0.4804770947 0.3608930111 0.3387751579
0.4748001099 0.363986969 0.3762528896
0.4625790119 0.3645150661 0.3335959911
0.5065748692 0.3570590019 0.3365750313
0.4803431034 0.4135499001 0.3330330849
0.4510772228 0.4421861172 0.341176033
0.503674984 0.3612480164 0.3561749458
0.5598649979 0.352314949 0.3766179085
0.4573421478 0.3527538776 0.3473439217
0.4863037268 0.3742785454 0.3488383293
一番下の行は平均です。最初の方法は100万の整数では少し遅いように見えますが、答えで述べたように、方法2の3倍のパフォーマンス向上に気づきませんでした。それは判明foreach
ループが私の場合は最速でした。Xdebugでベンチマークを行いました。
編集:答えが最初に投稿されてから久しぶりです。明確にするために、ベンチマークはphp 5.6で行われました。
array_map(function($v){ return (int)$v; }, $strings_array);
これが私が意味したことです
このコードをクロージャー(で紹介PHP 5.3
)とともに使用すると、受け入れられた回答よりも少し速く、私にとっては、それを整数にキャストする意図がより明確になります。
// if you have your values in the format '1,2,3,4', use this before:
// $stringArray = explode(',', '1,2,3,4');
$stringArray = ['1', '2', '3', '4'];
$intArray = array_map(
function($value) { return (int)$value; },
$stringArray
);
var_dump($intArray);
出力は次のようになります。
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
Markのソリューションでは、array([0]=> int 0)
「test」などの文字列を解析しようとすると戻ります。
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
別の短い方法は次のようになります:
$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
方法3と同じパフォーマンスです。
単純にする...
$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);
なぜ他の方法を探しているのですか?ループは苦痛なしで仕事をします。パフォーマンスが気になる場合は、を使用できますjson_decode ()
。人々はそれを使用する方法を投稿したので、ここではそれを含めません。
注: ===の代わりに==演算子を使用する場合、引用符なしの有効な数値を形成する場合、文字列値は自動的に数値(例:整数または倍精度)に変換されます。例えば:
$str = '1';
($str == 1) // true but
($str === 1) //false
したがって、==は問題を解決する可能性があり、効率的ですが、比較で===を使用すると中断します。
多次元アレイを使用している場合、前述のソリューションはどれも機能しません。これが私の解決策です:
public function arrayValuesToInt(&$array){
if(is_array($array)){
foreach($array as &$arrayPiece){
arrayValuesToInt($arrayPiece);
}
}else{
$array = intval($array);
}
}
次に、これを実行します。
arrayValuesToInt($multiDimentionalArray);
これにより、次のような配列が作成されます。
[["1","2"]["3","4"]]
このように見える:
[[1,2][3,4]
(これは、どのレベルの深度でも機能します)
入力 => '["3"、 "6"、 "16"、 "120"]'
使用した型変換 =>(int)$ s;
function Str_Int_Arr($data){
$h=[];
$arr=substr($data,1,-1);
//$exp=str_replace( ",","", $arr);
$exp=str_replace( "\"","", $arr);
$s='';
$m=0;
foreach (str_split($exp) as $k){
if('0'<= $k && '9'>$k || $k =","){
if('0' <= $k && '9' > $k){
$s.=$k;
$h[$m]=(int)$s;
}else{
$s="";
$m+=1;
}
}
}
return $h;
}
var_dump(Str_Int_Arr('["3","6","16","120"]'));
出力:
array(4) {
[0]=>
int(3)
[1]=>
int(6)
[2]=>
int(16)
[3]=>
int(120)
}
ありがとう