답변:
다음 코드를 통해이를 달성 할 수 있습니다.
$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);
이것은 Mark의 대답에서 나온 하나의 라이너입니다.
$integerIDs = array_map('intval', explode(',', $long_string));
이것이 JSON 접근법입니다.
$integerIDs = json_decode('[' . $long_string . ']', true);
나는 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에서 수행되었습니다.
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)
}
감사