配列値を文字列からintに変換する方法は?


233
$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);

戻り値

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}

値を文字列型ではなく整数型にする必要があります。これを行うには、foreachで配列をループして各文字列をintに変換するよりも良い方法がありますか?

回答:


537

次のコードでこれを実現できます。

$integerIDs = array_map('intval', explode(',', $string));

3
しかし、文字列「test」がある場合、次のようになります
。array

10
@Dmitry-そうです...それはOPの質問への回答であり、すべての潜在的な関連質問へのすべてのケースで100%完全な回答ではありません。OPには、テキストと数値のピックアンドミックスではなく、カンマ区切りの数値の文字列がありました
Mark Ba​​ker

1
array_filter($ array、 'is_numeric')を使用することをお勧めしますが、「0x539」、「0b01011」は数値であるため、100%trueになることはありません。
Dmitry Dubovitsky 2013年

35
@Dmitry-考えられるすべての状況で完璧ではないために特定の質問に対する18か月前の回答を批判し、より良い解決策があると考えている場合は、この質問に独自の回答を自由に追加して説明してくださいなぜあなたの答えがより良いのか...誰もあなたを止めてくれない...しかし、この答えはそのままにしておく
マーク・ベイカー

intval()は(int)キャストよりもパフォーマンスが低くなります。(int)で別のソリューションを使用することをお勧めします。こちらの方法3をご覧ください
Fabian Picone

43

これは、ほぼ3倍の速さよりもexplode()array_map()intval()

$integerIDs = json_decode('[' . $string . ']', true);

1
@Binod文字列に構文エラーがある可能性があります。次のようにフォーマットする必要があります:$ string = "1,2,3";
sgrodzicki 2013年

4
explode()+ array_map()+ intval()はjson_decode()ほど高速ではない可能性がありますが、選択するのに適したオプションではないことは明らかです。ユーザー入力のサニタイズ
staabm 2014年

2
これは特に、マップ+ to_intよりも高速な場合、恐ろしいです。php、どうして
そんなに

3
これは単なるマイクロ最適化です。文字列で満たされた配列を整数にキャストするような小さな操作を最適化する必要はありません。また、配列に多数の要素(たとえば、数十万の要素)が含まれている場合、プロジェクトには、この操作よりもはるかに大きな問題があります。
Andreas

1
@Andreasは、私にはマイクロ最適化のようには見えません。blackfire.io/profiles/compare/...
sgrodzicki

41

そのため、多数の整数に対する回答で言及されているいくつかのメソッドのパフォーマンスに興味がありました。

準備

0から100までの100万のランダムな整数の配列を作成するだけです。それよりも、文字列を取得するためにそれらを内破しました。

  $integers = array();

  for ($i = 0; $i < 1000000; $i++) {
      $integers[] = rand(0, 100);
  }

  $long_string = implode(',', $integers);

方法1

これは、Markの回答の1つのライナーです。

$integerIDs = array_map('intval', explode(',', $long_string));

方法2

これはJSONアプローチです:

  $integerIDs = json_decode('[' . $long_string . ']', true);

方法3

私はこれをマークの答えの修正として思いつきました。これはまだ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で行われました。


1
私は実際にパフォーマンスがPHP 7で同じに滞在し、かどうか不思議を行い、さらに好奇心方法1は、方法3キャストとどうなるの閉鎖/匿名のコールバック...と組み合わせるarray_mapをだろうか
jave.web

array_map(function($v){ return (int)$v; }, $strings_array);これが私が意味したことです
jave.web

foreach(メソッド1)、 'intval'を含むarray_map(メソッド2)、および10000000要素を含む配列の無名関数を含むarray_map(メソッド3)を使用して、PHP7.2でいくつかのテストを行いました。方法2の方が速い(〜0.6秒)、次に方法3(〜0.75秒)、次に方法1(〜1.1秒)という結果が出ました
ガブリエルリマ

20

このコードをクロージャー(で紹介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)
}

1
docによると、これは他の回答で提案されているcreate_functionよりも高速です。
2016年

1
@まではい、あなたは正しいです。また、create_functionはPHP 7.2.0以降では非推奨です。
Andreas

14

Markのソリューションでは、array([0]=> int 0)「test」などの文字列を解析しようとすると戻ります。

$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );

7

これが速いかどうかはわかりませんが、配列を2回反転すると、数値文字列が整数にキャストされます。

$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);

7

別の短い方法は次のようになります:

$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;

方法3と同じパフォーマンスです。


私にとっては最短かつ柔軟なソリューションです。
Ryan Arief

5

次のような配列がある場合:

$runners = ["1","2","3","4"];

そして、それらを整数に変換して配列内に保持したい場合は、次のようにしてください:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);

create_functionは、PHP 7.2.0以降非推奨です。create_functionを使用せず、無名関数を使用して私の答えを確認してください。
Andreas

4

私の解決策は、コールバック関数を使用して各値をキャストすることです。

$ids = array_map( function($value) { return (int)$value; }, $ids )

3

単純にする...

$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);

なぜ他の方法を探しているのですか?ループは苦痛なしで仕事をします。パフォーマンスが気になる場合は、を使用できますjson_decode ()。人々はそれを使用する方法を投稿したので、ここではそれを含めません。

注: ===の代わりに==演算子を使用する場合、引用符なしの有効な数値を形成する場合、文字列値は自動的に数値(例:整数または倍精度)に変換されます。例えば:

$str = '1';
($str == 1) // true but
($str === 1) //false

したがって、==は問題を解決する可能性があり、効率的ですが、比較で===を使用すると中断します。


2

多次元アレイを使用している場合、前述のソリューションはどれも機能しません。これが私の解決策です:

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]

(これは、どのレベルの深度でも機能します)


1

配列の値を変換できます:

<?php

$ids = explode(',', $strings);
foreach ($ids as $index => $value) {
    $ids[$index] = (int)$value;
}

別の変数($ ids)を使用する代わりに、explode関数の戻り値を返して$strings反復することもできます。

このソリューションは、最高のパフォーマンスで最も安全な方法だと思います。



0

入力 => '["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)
}

ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.