source

쉼표로 구분된 문자열을 정수 배열로 변환하시겠습니까?

factcode 2022. 9. 25. 00:15
반응형

쉼표로 구분된 문자열을 정수 배열로 변환하시겠습니까?

다음 코드:

$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 「」이 아닌string하려면 어레이를 보다 더 foreach 각각을 환산합니다.string로로 합니다.int

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

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

그래서 나는 많은 정수들에 대한 답에서 언급된 방법들의 성능이 궁금했다.

준비

0에서 100 사이의 100만 개의 정수로 이루어진 배열을 만들고 있습니다.그리고 나서, 나는 그 끈을 얻기 위해 그들을 폭파했다.

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

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

방법 1

이것은 마크의 답변 중 한 가지입니다.

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

방법 2

JSON의 접근방식은 다음과 같습니다.

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

방법 3

저는 마크의 답변을 수정하기 위해 이것을 생각해 냈습니다.도 쓰이고 요.explode()하지 합니다.array_map()레귤러로 쓰고 있어요.foreach를 위해 array_map()도 파싱하고 있어요.(int) »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 x x x x x x x x x x x x x x

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

은 3배 입니다.explode(),array_map() ★★★★★★★★★★★★★★★★★」intval():

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

사용합니다(에되어 있습니다).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)
}

은 '마르크의 해', '마르크의 해', '마르크의 해', '마르크의 해'가 됩니다.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;

Method 3과 같은 성능을 가지고 있습니다.

제 솔루션은 콜백 기능을 사용하여 각 가치를 창출하는 것입니다.

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

이것이 더 빠른지 알 수 없지만 배열을 두 번 뒤집으면 숫자 문자열이 정수에 캐스팅됩니다.

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

중요:중복된 값을 처리하는 경우에는 이 값을 사용하지 마십시오!

PHP 7.4 스타일:

$ids = array_map(fn(string $x): int => (int) $x, explode(',', $string));

심플하게...

$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]]

이것은, 어느 정도의 깊이에서도 동작합니다.

또는 다음을 사용할 수 있습니다.array_walk_recursive()간단한 답변을 원하시면 됩니다.

array_walk_recursive($array, function(&$value){
    $value = intval($value);
});

다음과 같은 어레이가 있는 경우:

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

또한 이들을 정수로 변환하여 배열 내에 유지하려면 다음 작업을 수행해야 합니다.

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);
$arr = ["adfsf", "*&^%$#^", "23", "25", "29"];

function convertArrayStringToArrayInt($arr)
{
    $result = [];
    foreach($arr as $value) {
        if ((int)$value !== 0) {
            $result[] = (int)$value;
        }
    }
    return $result;
}

$result = convertArrayStringToArrayInt($arr);

var_dump($result);

결과는 이렇습니다.

array(3) {
  [0]=> int(23)
  [1]=> int(25)
  [2]=> int(29)
}

입력 => '["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)
}

감사합니다.

<?php
    
$string = "1,2,3";
$ids = explode(',', $string );

array_walk( $ids, function ( &$id )
{
    $id = (int) $id;
});
var_dump( $ids );

아무도 프러포즈 안 했다니 놀랍네요filter_var방법은 대규모 데이터셋에서 얼마나 성능이 좋은지는 모르겠지만, 성능 대비 유효성이 중요한 경우 다음과 같은 예를 들 수 있습니다.

$sampleString = '1,2 3, 4, 6, 5 , a';
$filteredValues = filter_var(
     explode(',', $sampleString),
     FILTER_VALIDATE_INT,
     FILTER_NULL_ON_FAILURE | FILTER_FORCE_ARRAY
);
array (size=6)
  0 => int 1
  1 => null
  2 => int 4
  3 => int 6
  4 => int 5
  5 => null

당신이 볼 수 있듯이.2 3와 같은 유효한 숫자가 아닙니다.a로 대체되었습니다.null

빈 값을 제거하려면array_filter

$filteredValues = array_filter($filteredValues);

다음과 같은 결과를 얻을 수 있습니다.

array (size=4)
  0 => int 1
  2 => int 4
  3 => int 6
  4 => int 5

또 다른 방법은 착신값을 입력(동작)하는 것입니다.int문자열을 폭발시킨 후 입력합니다.

이러한 기술은 엄격한 타이핑을 사용하도록 php를 설정하지 않는 한 데모 링크에서 설명한 대로 작동합니다.

다음 기술을 사용하여 숫자가 아닌 문자열을 삭제하지 마십시오.모든 값이 수치인 것을 전제로 합니다.

부동값이 이러한 기법으로 전달되면 정수로 잘리거나 플로어됩니다.

코드: (데모)

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

echo "\n---\n";
array_walk($array, function(int &$int){;});
var_dump($array);

echo "\n---\n";
var_dump(
    array_map(function(int $i){ return $i; }, explode(',', $string))
);

echo "\n---\n";
var_dump(
    array_map(fn(int $i) => $i, explode(',', $string)) // PHP 7.4 arrow function syntax
);

출력:

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

---
array(3) {
  [0]=> int(1)
  [1]=> int(2)
  [2]=> int(3)
}

---
array(3) {
  [0]=> int(1)
  [1]=> int(2)
  [2]=> int(3)
}

---
array(3) {
  [0]=> int(1)
  [1]=> int(2)
  [2]=> int(3)
}

언급URL : https://stackoverflow.com/questions/9593765/convert-a-comma-delimited-string-into-array-of-integers

반응형