$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
zwroty
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Potrzebuję, aby wartości były typu int zamiast ciągu typu. Czy istnieje lepszy sposób na zrobienie tego niż zapętlanie tablicy za pomocą foreach i konwertowanie każdego łańcucha na int?
To jest prawie 3 razy szybciej niż
explode()
,array_map()
iintval()
:źródło
Byłem więc ciekawy wydajności niektórych metod wymienionych w odpowiedziach na dużą liczbę liczb całkowitych.
Przygotowanie
Właśnie stworzyłem tablicę 1 miliona losowych liczb całkowitych od 0 do 100. Następnie zaimplodowałem je, aby uzyskać ciąg.
Metoda 1
To jest jedna linijka z odpowiedzi Marka:
Metoda 2
Oto podejście JSON:
Metoda 3
Wymyśliłem ten jako modyfikację odpowiedzi Marka. To wciąż jest używane
explode()
funkcji, ale zamiast wywoływaćarray_map()
, używam regularnejforeach
pętli, aby wykonać pracę, aby uniknąć narzutuarray_map()
. Parsuję też z(int)
vsintval()
, ale wypróbowałem oba, i nie ma dużej różnicy pod względem wydajności.Wyniki:
Dolna linia to średnia. Wygląda na to, że pierwsza metoda była nieco wolniejsza dla 1 miliona liczb całkowitych, ale nie zauważyłem 3-krotnego wzrostu wydajności metody 2, jak stwierdzono w odpowiedzi. Okazało się
foreach
pętla była najszybsza w moim przypadku. Przeprowadziłem testy porównawcze z Xdebug.Edycja: Minęło trochę czasu, odkąd pierwotnie opublikowano odpowiedź. Aby to wyjaśnić, test został przeprowadzony w php 5.6.
źródło
array_map(function($v){ return (int)$v; }, $strings_array);
o to mi chodziłoUżyj tego kodu z zamknięciem (wprowadzonym w
PHP 5.3
), jest to nieco szybsze niż zaakceptowana odpowiedź, a dla mnie zamiar przekazania go na liczbę całkowitą jest wyraźniejszy:Dane wyjściowe będą:
źródło
W rozwiązaniu Marka wrócisz,
array([0]=> int 0)
jeśli spróbujesz parsować ciąg taki jak „test”.źródło
Nie jestem pewien, czy jest to szybsze, ale dwukrotne odwrócenie tablicy spowoduje rzut ciągów liczbowych na liczby całkowite:
źródło
Alternatywną krótszą metodą może być:
Ma taką samą wydajność jak metoda 3.
źródło
Jeśli masz tablicę typu:
A jeśli chcesz ukryć je w liczbach całkowitych i zachować w obrębie tablicy, wykonaj następujące czynności:
źródło
Moje rozwiązanie rzuca każdą wartość za pomocą funkcji zwrotnej:
źródło
Nie komplikuj...
Dlaczego szukasz innych sposobów? Pętla wykonuje pracę bez bólu. Jeśli zależy Ci na wydajności, możesz iść dalej
json_decode ()
. Ludzie napisali, jak z tego korzystać, więc nie zamieszczam go tutaj.Uwaga: W przypadku użycia operatora == zamiast === wartości ciągu są automatycznie konwertowane na liczby (np. Liczba całkowita lub podwójna), jeśli tworzą poprawną liczbę bez cudzysłowów. Na przykład:
Tak więc == może rozwiązać twój problem, jest wydajny, ale zepsuje się, jeśli użyjesz === w porównaniach.
źródło
Jeśli masz tablicę wielowymiarową, żadne z wcześniej wymienionych rozwiązań nie będzie działać. Oto moje rozwiązanie:
Następnie zrób to:
Spowoduje to utworzenie takiej tablicy:
wygląda jak to:
(Będzie to działać na dowolnym poziomie głębokości)
źródło
Możesz przekonwertować wartości w tablicy:
Możesz także zwrócić wartość zwracaną przez
explode
funkcję do$strings
i iterować ją zamiast używać innej zmiennej ($ ids).Myślę, że to rozwiązanie jest najbezpieczniejszym sposobem z najlepszą wydajnością.
źródło
Styl PHP 7.4:
źródło
Wejście => „[„ 3 ”,„ 6 ”,„ 16 ”,„ 120 ”]”
Konwersja typu, którego użyłem => (int) $ s;
Wynik:
Dzięki
źródło