jak przekonwertować wartości tablicy z string na int?
$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
Zwraca
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Chcę, aby wartości były typu int zamiast typu string. Czy istnieje lepszy sposób na zrobienie tego niż zapętlenie tablicy za pomocą foreach i przekształcenie każdego ciągu znaków w int?
10 answers
$integerIDs = array_map('intval', explode(',', $string));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 23:55:27
To prawie 3 razy szybciej niż explode()
, array_map()
i intval()
:
$integerIDs = json_decode('[' . $string . ']', true);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-16 09:39:27
Byłem więc ciekaw wydajności niektórych metod wymienionych w odpowiedziach dla dużej liczby liczb całkowitych.
Przygotowanie
Po prostu tworzymy tablicę 1 miliona losowych liczb całkowitych z zakresu od 0 do 100. Potem implodowałem je, żeby zdobyć sznurek.
$integers = array();
for ($i = 0; $i < 1000000; $i++) {
$integers[] = rand(0, 100);
}
$long_string = implode(',', $integers);
Metoda 1
Oto jedyna linijka z odpowiedzi Marka:
$integerIDs = array_map('intval', explode(',', $long_string));
Metoda 2
To jest podejście JSON:
$integerIDs = json_decode('[' . $long_string . ']', true);
Metoda 3
Wymyśliłem to jako modyfikacja odpowiedzi Marka. W dalszym ciągu używa się funkcji explode()
, ale zamiast wywoływać array_map()
używam zwykłej pętli foreach
, aby uniknąć napowietrznego działania array_map()
. Analizuję również (int)
vs intval()
, ale próbowałem obu i nie ma dużej różnicy pod względem wydajności.
$result_array = array();
$strings_array = explode(',', $long_string);
foreach ($strings_array as $each_number) {
$result_array[] = (int) $each_number;
}
Wyniki:
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
W dolnej linii jest średnia. Wygląda na to, że pierwsza metoda była trochę wolniejsza dla 1 miliona liczb całkowitych, ale nie zauważyłem 3x zwiększenia wydajności Metoda 2, Jak podano w odpowiedzi. Okazało się, że pętla była najszybsza w moim przypadku. Zrobiłem benchmarking z Xdebug.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-01 23:50:25
Użyj tego kodu z zamknięciem (wprowadzonym w PHP 5.3
), jest on nieco szybszy od zaakceptowanej odpowiedzi i dla mnie zamiar wrzucenia go do liczby całkowitej jest jaśniejszy:
// 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);
Wyjście będzie:
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 14:29:37
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
W rozwiązaniu Mark 'a, zwrócisz array([0]=> int 0)
, jeśli spróbujesz przetworzyć ciąg znaków ,taki jak"test".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 08:46:54
Jeśli masz tablicę typu:
$runners = ["1","2","3","4"];
I jeśli chcesz ukryć je w liczbach całkowitych i zachować w tablicy, wykonaj następujące zadanie:
$newArray = array_map( create_function('$value', 'return (int)$value;'),
$runners);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 11:54:10
Nie wiem, czy jest to szybsze, ale dwukrotne odwrócenie tablicy spowoduje wyświetlenie ciągów liczbowych na liczby całkowite:
$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 11:16:13
To proste...
$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);
Dlaczego szukasz innych sposobów? Zapętlenie działa bez bólu. Jeśli zależy ci na wydajności, możesz wybrać json_decode ()
. Ludzie napisali jak z tego korzystać, więc nie zamieszczam tego tutaj.
Uwaga: podczas używania operatora = = zamiast===, wartości łańcuchów są automatycznie konwertowane na liczby (np. integer lub double), jeśli tworzą poprawną liczbę bez cudzysłowów. Na przykład:
$str = '1';
($str == 1) // true but
($str === 1) //false
Tak więc, = = może rozwiązać twój problem, jest wydajny, ale złamie się, jeśli użyjesz = = = w porównaniach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 07:46:26
Alternatywną metodą krótszą może być:
$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;
Ma taką samą wydajność jak Metoda 3.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 13:25:51
Jeśli macie macierz wielowymiarową, żadne z wyżej wymienionych rozwiązań nie zadziała. Oto moje rozwiązanie:
public function arrayValuesToInt(&$array){
if(is_array($array)){
foreach($array as &$arrayPiece){
arrayValuesToInt($arrayPiece);
}
}else{
$array = intval($array);
}
}
Więc zrób to:
arrayValuesToInt($multiDimentionalArray);
To utworzy tablicę taką jak:
[["1","2"]["3","4"]]
Wygląda tak:
[[1,2][3,4]
(będzie to działać z dowolnym poziomem głębokości)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 05:54:10