PHP, $ array [] = $ value 또는 array_push ($ array, $ value)에서 사용하는 것이 더 낫습니까?


113

배열 구성원을 추가하기 위해 PHP에서 사용하는 것이 더 낫습니다.

$array[] = $value;

또는

array_push($array, $value);

?

매뉴얼에는 함수 호출을 피하는 것이 더 낫다고 나와 있지만 필자는 읽은 $array[]것보다 훨씬 느립니다 array_push(). 몇 가지 설명 또는 벤치 마크는 무엇입니까?


2
$ myArray [] = 123; 이것은 array_push 함수보다 빠릅니다. 해당 배열에 값을 직접 추가합니다. 함수에는 해당 변수에 대한 별도의 스택이 있습니다. 그 함수 안에 그 문장이있을 수 있습니다.
sganesh 2010 년

답변:


150

벤치 마크는 없지만 개인적 $array[]으로보기가 더 깔끔하고 수십만 개의 문자열을 배열에 추가 할 계획이 아니라면 정직하게 밀리 초에 걸쳐 머리카락을 분할하는 것은 무의미하다고 생각합니다.

편집 :이 코드 실행 :

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

사용하는 첫 번째 방법 $array[]은 두 번째 방법 보다 거의 50 % 빠릅니다.

일부 벤치 마크 결과 :

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

PHP 매뉴얼에 다음과 같이 언급되어 있으므로 이것은 놀라운 일이 아닙니다.

array_push ()를 사용하여 하나의 요소를 배열에 추가하는 경우 $ array [] =를 사용하는 것이 좋습니다. 이렇게하면 함수 호출에 대한 오버 헤드가 없기 때문입니다.

array_push여러 값을 추가 할 때 더 효율적 이라고 표현되는 방식은 놀라지 않을 것 입니다. 편집 : 호기심에서 몇 가지 추가 테스트를 수행했으며 많은 양의 추가에도 개별 $array[]통화가 큰 것보다 빠릅니다 array_push. 흥미 롭군.


나는 항상 어느 것이 가장 빠른 방법인지 알고 싶어하기 때문에 날이 오면 트래픽이 많은 사이트를 생성하라는 요청을 받고 통찰력을 얻을 것입니다. 답변 해주셔서 감사합니다.
alex

10
이와 같은 마이크로 최적화는 노력할 가치가 거의 없습니다. 처음부터 작성하는 경우 가장 합리적인 방법으로 작성하고 페이지를 생성하는 것이 약간 느리면 프로파일 링하십시오. 속도를 높이기 위해 이와 같은 것을 변경해야 할 가능성은 거의 없습니다.
Alister Bulman

4
확인하기 위해 코드가 출력과 일치하지 않는 것처럼 보이므로 $array[]실제로 컴퓨터에서 1M 할당에 대해 300ms 대 2000ms 라는 것이 훨씬 빠르다는 것을 확인했습니다 . 그러나 array_push에서 한 번에 20 개의 항목을 추가하는 것은 약 20 $array[] =초 정도 빠릅니다 .
Elle

5
@AlisterBulman 마이크로 최적화는 전체 코드베이스를 다시 살펴보고 '최적화'하려는 경우 노력할 가치가 없습니다. 그러나 동일한 작업을 수행하는 여러 가지 다른 방법이 있고 한 가지 방법이 다른 방법보다 더 낫다는 것을 (아주 조금이라도) 알고 있다면 그 방법을 사용하는 습관을 들일 수 있습니다. 왜 이렇게하지 않겠습니까?
Okonomiyaki3000

2
난 강력하게, 또는 적어도 부분적를, 동의합니다 @AlisterBulman 당신은 더 나은, 더 나은 기록을 알고 있다면 ,하지만 검색에 많은 노력을하지 않는 ... 마이크로 최적화
jave.web

42

array_push ()의 주요 용도는 배열 끝에 여러 값을 푸시 할 수 있다는 것입니다.

문서 에 나와 있습니다 .

array_push ()를 사용하여 하나의 요소를 배열에 추가하는 경우 $ array [] =를 사용하는 것이 좋습니다. 이렇게하면 함수 호출에 대한 오버 헤드가 없기 때문입니다.


29

에 대한 PHP 문서에서array_push :

참고 : array_push ()를 사용하여 하나의 요소를 배열에 추가하는 경우 $ array [] =를 사용하는 것이 좋습니다. 이렇게하면 함수를 호출하는 오버 헤드가 없기 때문입니다.


귀하의 답변이 처음이었던 방법이 재미 있지만 투표가 적습니다.
T.Woody

21

길거리에서 []는 함수 호출에 대한 오버 헤드가 없기 때문에 더 빠르다는 것입니다. 게다가 PHP의 배열 함수를 좋아하는 사람은 없습니다 ...

"그건 ... 건초 더미, 바늘 .... 아니면 바늘 건초 더미 ... 아, 젠장 ... [] ="


7
어? PHP의 배열 함수는 훌륭합니다.
cletus

13
기능적으로 그들은 굉장하지만, 그는 일관성없는 명명 체계를 언급하고있었습니다.
ryeguy

2
IDE에서 매개 변수 힌트를 켜야합니다. 그러나 나는 동의한다. 약간의 일관성이 좋았을 것이다.
Pim Jager

4
나는 이것에 동의합니다. 이름 지정 체계 (x_y 또는 xy 또는 y_x ...) 나 매개 변수 논리 (배열, 문자열 및 정규 표현식 간에 대상 객체를 먼저 전달하고 마지막으로 전달합니다. 공통 규칙을 찾는 데 행운을 빕니다!) 에도 일관성이 없습니다 .
e2-e4

3
FWIW, 저는 needle / haystack 명명 규칙을 좋아하고 "건초 더미에서 바늘 (1) 찾기 (2)"
rybo111

8

한 가지 차이점은 두 개 이상의 매개 변수를 사용하여 array_push ()를 호출 할 수 있다는 것입니다. 즉, 한 번에 두 개 이상의 요소를 배열에 푸시 할 수 있습니다.

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

인쇄물 1,2,3,4


2

간단한 $ myarray [] 선언은 함수가 가져올 오버 헤드가 없기 때문에 항목 스택에 항목을 밀어 넣는 것이므로 더 빠릅니다.


2

" array_push "는 함수이고 루프 내부에있을 때 여러 번 호출되므로 스택에 메모리를 할당합니다. 그러나 우리가 $ array [] = $ value를 사용할 때 우리는 단지 값을 배열에 할당합니다.


1

두 번째는 함수 호출이므로 일반적으로 핵심 어레이 액세스 기능을 사용하는 것보다 느립니다. 그러나 스크립트 내에서 하나의 데이터베이스 쿼리조차도 array_push().


0

성능에 대한 질문이 더 많았지 만 사람들은이 질문을 사용 array_push하거나 사용하는 것이 좋은지 궁금해 할 것입니다.$arr[] .

이 함수는 여러 값에 대해 더 적은 줄을 의미 할 수 있습니다.

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

그러나 , array_push...

  • 배열 키를받을 수 없습니다.
  • 나누기 바늘 / 건초 더미를 명명 규칙을
  • 논의 된 바와 같이 느립니다.

나는 $arr[].


0

추가하고 싶지 않습니다 : int array_push(...)배열의 새로운 요소 수를 반환합니다 ( php doc ). 보다 유용하고 압축 할 수 있습니다 $myArray[] = ...; $total = count($myArray);.

또한 array_push(...)변수가 스택으로 사용될 때 의미가있다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.