[php] 배열 값을 문자열에서 int로 변환하는 방법은 무엇입니까?

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

보고

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

문자열 유형 대신 값이 int 유형이어야합니다. foreach로 배열을 반복하고 각 문자열을 int로 변환하는 것보다 더 좋은 방법이 있습니까?



답변

다음 코드를 통해이를 달성 할 수 있습니다.

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


답변

이 거의 3 배 빠른보다 explode(), array_map()그리고 intval():

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


답변

그래서 많은 정수에 대한 답변에서 언급 된 일부 방법의 성능에 대해 궁금했습니다.

예비

0에서 100 사이의 1 백만 개의 임의 정수 배열을 만드는 것만으로도 문자열을 얻기 위해 그것들을 내포했습니다.

  $integers = array();

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

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

방법 1

이것은 Mark의 대답에서 나온 하나의 라이너입니다.

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

방법 2

이것이 JSON 접근법입니다.

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

방법 3

나는 Mark의 대답을 수정하여 이것을 생각해 냈습니다. 이것은 여전히 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

결론은 평균입니다. 첫 번째 방법은 1 백만 정수에 대해 조금 느리게 보이지만 답변에 명시된 방법 2의 3 배 성능 향상을 보지 못했습니다. 그것은 밝혀졌다 foreach루프가 내 경우에는 가장 빠른 하나였다. Xdebug로 벤치마킹을 완료했습니다.

편집 : 답변이 원래 게시 된 지 오래되었습니다. 명확히하기 위해 벤치 마크는 PHP 5.6에서 수행되었습니다.


답변

이 코드를 클로저 (에서 소개 됨 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' ) );


답변

이것이 더 빠른지 확실하지 않지만 배열을 두 번 뒤집 으면 숫자 문자열이 정수로 캐스팅됩니다.

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


답변

다른 짧은 방법은 다음과 같습니다.

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

방법 3과 동일한 성능을 갖습니다.