함수 - push_array php




배열의 모든 n 번째 항목 선택 (6)

foreach 루프는 비교 테스트를 기반으로 대규모 배열에서 가장 빠른 반복을 제공합니다. 누군가 루프 풀기 문제를 해결하기를 원하지 않는 한 당신과 비슷한 것을 고수 할 것입니다.

이 대답은 더 빨리 실행되어야합니다.

$result = array();
$i = 0;
foreach($source as $value) {
    if ($i++ % 205 == 0) {
        $result[] = $value;
    }
}

테스트 할 시간이 없지만 처음에 수치 적으로 배열의 인덱스를 작성하는 경우 변형 된 @ haim의 솔루션을 사용할 수 있습니다. 이전 솔루션에 비해 어떤 이득을 얻을 수 있는지 알아 보는 것이 좋습니다.

$result = array();
$source = array_values($source);
$count = count($source);
for($i = 0; $i < $count; $i += 205) {
    $result[] = $source[$i];
}

이것은 array_values ​​함수가 얼마나 최적화되었는지에 크게 달려 있습니다. 그것은 아주 잘 수행 할 수 있습니다.

큰 배열의 모든 n 번째 항목을 선택하는 가장 효율적인 방법은 무엇입니까? 그것을 할 수있는 '똑똑한'방법이 있을까요 아니면 유일한 방법을 반복하고 있습니까?

고려해야 할 몇 가지 사항 :

  • 배열은 130,000 개의 항목으로 상당히 큽니다.
  • 205 번째 항목마다 선택해야합니다.
  • 항목은 숫자로 색인화되지 않으므로 for($i = 0; $i <= 130000; $i += 205) 는 작동하지 않습니다.

지금까지 내가 생각해 낸 가장 효율적인 방법은 다음과 같습니다.

$result = array();
$i = 0;
foreach($source as $value) {

    if($i >= 205) {
        $i = 0;
    }

    if($i == 0) {
        $result[] = $value;
    }

    $i++;
}

또는 모듈러스와 동일 :

$result = array();
$i = 0;
foreach($source as $value) {
    if($i % 205 == 0) {
        $result[] = $value;
    }
    $i++;
}

이 방법은 상당히 느릴 수 있습니다. 개선 할 방법이 있습니까? 아니면 여기서 머리카락을 나눌까요?

편집하다

적절한 설명으로 모든 주위의 좋은 답변을 허용 된 대답으로 가장 적합하게 선택하려고했습니다. 감사!


이 문제에 대한 해결책은 PHP 문법이 아니라 코드 디자인에 있다고 생각합니다.

숫자로 인덱스 된 배열을 만들거나 (응용 프로그램에서 그럴듯하지 않을 수도 있음) 205 번째 항목을 모두 추적하거나 배열을 한 번만 검색합니다 (각 205 번째 항목의 목록 저장).

내 마음 속에서 각 205 번째 항목을 추적하는 것은 더 쉽게 구현할 수 있습니다. 데이터베이스에있는 모든 항목의 수를 유지하거나 항목을 추가 할 때마다 계수의 모듈 수를 확인하십시오. 다른 205 번째 항목이 있으면 배열에 추가하십시오. 그러나 항목이 삭제되면 이는 더 까다로울 수 있습니다. 205 번째 항목을 모두 재 배열하려면 전체 배열을 다시 검사해야 할 수도 있습니다.

이렇게하면 삭제 된 항목에서 시작하여 앞으로 나아갈 수 있다면 더 간단 할 것입니다. 그러나 다시 이것은 수치 적으로 배열 된 배열에 대해서만 작동합니다 - 그리고 그것이 사실이라면 앞으로 나아갈 필요가 없습니다. 그것을 다시 계산하기위한 약간의 수학.

  • 수치 인덱스 -보다 나은 장기 솔루션이지만 구현하기가 어렵습니다.
  • 추적 유지 - 구현하기가 더 쉽지만 항목을 삭제하면 더러워 져야합니다.
  • 항목 캐싱 - 다른 두 솔루션에 대해서도이 작업을 수행해야하지만 배열 자체가 수정 될 때까지는 속도가 빠릅니다.이 경우 다시 작업해야합니다.

한 번에 두 번 이상 배열 포인터를 이동할 수 없습니다. 나는 이것을 개인적으로 사용할 것이다.

reset($source);
$next = true;
while($next === true){
    $result[] = current($source);
    for(i=0;i<205;i++){
        $next = next($source);
    }
}

누군가가 한 번에 한 단계 이상으로 배열 포인터를 움직일 수있는 함수를 찾을 수 있다면 더 좋은 대답을 얻을 수 있습니다. 나는 이것이 좋다고 생각한다.



array_slice 를 사용하는 것이 좋습니다.

$count = count($array) ;
for($i=205;$i<$count;$i+=205){
    $result[] = array_slice($array,$i,1);
}

배열이 수치 적으로 색인 된 경우 매우 빠릅니다.

$count = count($array) ;
for($i=205;$i<$count;$i+=205){
    $result[] = $array[$i];
}

  • 2 차원 배열 만들기 [205] [N]
  • 배열에 데이터로드
  • 모든 N에 대해 205 번째 요소에 액세스

어리석은 것처럼 들릴지 모르지만 정의에 따르면 메모리 위치에 직접 액세스하고 비교를 수행하지 않기 때문에 가장 빠릅니다.







arrays