2010-05-18 2 views
5

배열을 작고 균등하게 분산 된 배열로 분할해야하는 함수가 있습니다. 그러나 그 과정에서 데이터가 복제되는 것 같습니다. 누구든지 나를 도울 수 있으면 좋을 것 같아. 여기 PHP는 작은 짝수 배열로 배열을 배열합니다

Array 
(
    [0] => stdClass Object 
     (
      [bid] => 42 
      [name] => Ray White Mordialloc 
      [imageurl] => sp_raywhite.gif 
      [clickurl] => http://www.raywhite.com/ 
     ) 

    [1] => stdClass Object 
     (
      [bid] => 48 
      [name] => Beachside Osteo 
      [imageurl] => sp_beachside.gif 
      [clickurl] => http://www.beachsideosteo.com.au/ 
     ) 

    [2] => stdClass Object 
     (
      [bid] => 53 
      [name] => Carmotive 
      [imageurl] => sp_carmotive.jpg 
      [clickurl] => http://www.carmotive.com.au/ 
     ) 

    [3] => stdClass Object 
     (
      [bid] => 51 
      [name] => Richmond and Bennison 
      [imageurl] => sp_richmond.jpg 
      [clickurl] => http://www.richbenn.com.au/ 
     ) 

    [4] => stdClass Object 
     (
      [bid] => 50 
      [name] => Letec 
      [imageurl] => sp_letec.jpg 
      [clickurl] => www.letec.biz 
     ) 

    [5] => stdClass Object 
     (
      [bid] => 39 
      [name] => Main Street Mordialloc 
      [imageurl] => main street cafe.jpg 
      [clickurl] => 
     ) 

    [6] => stdClass Object 
     (
      [bid] => 40 
      [name] => Ripponlea Mitsubishi 
      [imageurl] => sp_mitsubishi.gif 
      [clickurl] => 
     ) 

    [7] => stdClass Object 
     (
      [bid] => 34 
      [name] => Adrianos Pizza & Pasta 
      [imageurl] => sp_adrian.gif 
      [clickurl] => 
     ) 

    [8] => stdClass Object 
     (
      [bid] => 59 
      [name] => Pure Sport 
      [imageurl] => sp_psport.jpg 
      [clickurl] => http://www.puresport.com.au/ 
     ) 

    [9] => stdClass Object 
     (
      [bid] => 33 
      [name] => Two Brothers 
      [imageurl] => sp_2brothers.gif 
      [clickurl] => http://www.2brothers.com.au/ 
     ) 

    [10] => stdClass Object 
     (
      [bid] => 52 
      [name] => Mordialloc Travel and Cruise 
      [imageurl] => sp_morditravel.jpg 
      [clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html 
     ) 

    [11] => stdClass Object 
     (
      [bid] => 57 
      [name] => Southern Suburbs Physiotherapy Centre 
      [imageurl] => sp_sspc.jpg 
      [clickurl] => http://www.sspc.com.au 
     ) 

    [12] => stdClass Object 
     (
      [bid] => 54 
      [name] => PPM Builders 
      [imageurl] => sp_ppm.jpg 
      [clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders 
     ) 

    [13] => stdClass Object 
     (
      [bid] => 36 
      [name] => Big River 
      [imageurl] => sp_bigriver.gif 
      [clickurl] => 
     ) 

    [14] => stdClass Object 
     (
      [bid] => 35 
      [name] => Bendigo Bank Parkdale/Mentone East 
      [imageurl] => sp_bendigo.gif 
      [clickurl] => http://www.bendigobank.com.au 
     ) 

    [15] => stdClass Object 
     (
      [bid] => 56 
      [name] => Logical Services 
      [imageurl] => sp_logical.jpg 
      [clickurl] => 
     ) 

    [16] => stdClass Object 
     (
      [bid] => 58 
      [name] => Dicount Lollie Shop 
      [imageurl] => new dls logo.jpg 
      [clickurl] => 
     ) 

    [17] => stdClass Object 
     (
      [bid] => 46 
      [name] => Patterson Securities 
      [imageurl] => cmyk patersons_withtag.jpg 
      [clickurl] => 
     ) 

    [18] => stdClass Object 
     (
      [bid] => 44 
      [name] => Mordialloc Personal Trainers 
      [imageurl] => sp_mordipt.gif 
      [clickurl] => # 
     ) 

    [19] => stdClass Object 
     (
      [bid] => 37 
      [name] => Mordialloc Cellar Door 
      [imageurl] => sp_cellardoor.gif 
      [clickurl] => 
     ) 

    [20] => stdClass Object 
     (
      [bid] => 41 
      [name] => Print House Graphics 
      [imageurl] => sp_printhouse.gif 
      [clickurl] => 
     ) 

    [21] => stdClass Object 
     (
      [bid] => 55 
      [name] => 360South 
      [imageurl] => sp_360.jpg 
      [clickurl] => 
     ) 

    [22] => stdClass Object 
     (
      [bid] => 43 
      [name] => Systema 
      [imageurl] => sp_systema.gif 
      [clickurl] => 
     ) 

    [23] => stdClass Object 
     (
      [bid] => 38 
      [name] => Lowe Financial Group 
      [imageurl] => sp_lowe.gif 
      [clickurl] => http://lowefinancial.com/ 
     ) 

    [24] => stdClass Object 
     (
      [bid] => 49 
      [name] => Kim Reed Conveyancing 
      [imageurl] => sp_kimreed.jpg 
      [clickurl] => 
     ) 

    [25] => stdClass Object 
     (
      [bid] => 45 
      [name] => Mordialloc Sporting Club 
      [imageurl] => msc logo.jpg 
      [clickurl] => 
     ) 

) 

배열 분할 의미 PHP 함수이다 :

여기 원의 배열이 여기

function split_array($array, $slices) { 

     $perGroup = floor(count($array)/$slices); 
     $Remainder = count($array) % $slices ; 
     $slicesArray = array(); 

     $i = 0; 
     while($i < $slices) { 
      $slicesArray[$i] = array_slice($array, $i * $perGroup, $perGroup); 
      $i++; 
     } 

     if ($i == $slices) { 
      if ($Remainder > 0 && $Remainder < $slices) { 

       $z = $i * $perGroup +1; 
       $x = 0; 
       while ($x < $Remainder) { 

        $slicesRemainderArray = array_slice($array, $z, $Remainder+$x); 
        $remainderItems = array_merge($slicesArray[$x],$slicesRemainderArray); 
        $slicesArray[$x] = $remainderItems; 

       $x++; 
       $z++; 
       } 
      } 
     }; 

     return $slicesArray; 
    } 

는 분할의 결과이다를 (어떻게 든 원래 배열로부터 항목을 복제 작은 배열로) :

Array 
(
    [0] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 57 
        [name] => Southern Suburbs Physiotherapy Centre 
        [imageurl] => sp_sspc.jpg 
        [clickurl] => http://www.sspc.com.au 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 35 
        [name] => Bendigo Bank Parkdale/Mentone East 
        [imageurl] => sp_bendigo.gif 
        [clickurl] => http://www.bendigobank.com.au 
       ) 

      [2] => stdClass Object 
       (
        [bid] => 38 
        [name] => Lowe Financial Group 
        [imageurl] => sp_lowe.gif 
        [clickurl] => http://lowefinancial.com/ 
       ) 

      [3] => stdClass Object 
       (
        [bid] => 39 
        [name] => Main Street Mordialloc 
        [imageurl] => main street cafe.jpg 
        [clickurl] => 
       ) 

      [4] => stdClass Object 
       (
        [bid] => 48 
        [name] => Beachside Osteo 
        [imageurl] => sp_beachside.gif 
        [clickurl] => http://www.beachsideosteo.com.au/ 
       ) 

      [5] => stdClass Object 
       (
        [bid] => 33 
        [name] => Two Brothers 
        [imageurl] => sp_2brothers.gif 
        [clickurl] => http://www.2brothers.com.au/ 
       ) 

      [6] => stdClass Object 
       (
        [bid] => 40 
        [name] => Ripponlea Mitsubishi 
        [imageurl] => sp_mitsubishi.gif 
        [clickurl] => 
       ) 

     ) 

    [1] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 44 
        [name] => Mordialloc Personal Trainers 
        [imageurl] => sp_mordipt.gif 
        [clickurl] => # 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 41 
        [name] => Print House Graphics 
        [imageurl] => sp_printhouse.gif 
        [clickurl] => 
       ) 

      [2] => stdClass Object 
       (
        [bid] => 39 
        [name] => Main Street Mordialloc 
        [imageurl] => main street cafe.jpg 
        [clickurl] => 
       ) 

      [3] => stdClass Object 
       (
        [bid] => 48 
        [name] => Beachside Osteo 
        [imageurl] => sp_beachside.gif 
        [clickurl] => http://www.beachsideosteo.com.au/ 
       ) 

      [4] => stdClass Object 
       (
        [bid] => 33 
        [name] => Two Brothers 
        [imageurl] => sp_2brothers.gif 
        [clickurl] => http://www.2brothers.com.au/ 
       ) 

      [5] => stdClass Object 
       (
        [bid] => 40 
        [name] => Ripponlea Mitsubishi 
        [imageurl] => sp_mitsubishi.gif 
        [clickurl] => 
       ) 

     ) 

    [2] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 56 
        [name] => Logical Services 
        [imageurl] => sp_logical.jpg 
        [clickurl] => 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 43 
        [name] => Systema 
        [imageurl] => sp_systema.gif 
        [clickurl] => 
       ) 

      [2] => stdClass Object 
       (
        [bid] => 48 
        [name] => Beachside Osteo 
        [imageurl] => sp_beachside.gif 
        [clickurl] => http://www.beachsideosteo.com.au/ 
       ) 

      [3] => stdClass Object 
       (
        [bid] => 33 
        [name] => Two Brothers 
        [imageurl] => sp_2brothers.gif 
        [clickurl] => http://www.2brothers.com.au/ 
       ) 

      [4] => stdClass Object 
       (
        [bid] => 40 
        [name] => Ripponlea Mitsubishi 
        [imageurl] => sp_mitsubishi.gif 
        [clickurl] => 
       ) 

     ) 

    [3] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 53 
        [name] => Carmotive 
        [imageurl] => sp_carmotive.jpg 
        [clickurl] => http://www.carmotive.com.au/ 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 45 
        [name] => Mordialloc Sporting Club 
        [imageurl] => msc logo.jpg 
        [clickurl] => 
       ) 

      [2] => stdClass Object 
       (
        [bid] => 33 
        [name] => Two Brothers 
        [imageurl] => sp_2brothers.gif 
        [clickurl] => http://www.2brothers.com.au/ 
       ) 

      [3] => stdClass Object 
       (
        [bid] => 40 
        [name] => Ripponlea Mitsubishi 
        [imageurl] => sp_mitsubishi.gif 
        [clickurl] => 
       ) 

     ) 

    [4] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 59 
        [name] => Pure Sport 
        [imageurl] => sp_psport.jpg 
        [clickurl] => http://www.puresport.com.au/ 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 54 
        [name] => PPM Builders 
        [imageurl] => sp_ppm.jpg 
        [clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders 
       ) 

      [2] => stdClass Object 
       (
        [bid] => 40 
        [name] => Ripponlea Mitsubishi 
        [imageurl] => sp_mitsubishi.gif 
        [clickurl] => 
       ) 

     ) 

    [5] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 46 
        [name] => Patterson Securities 
        [imageurl] => cmyk patersons_withtag.jpg 
        [clickurl] => 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 34 
        [name] => Adriano's Pizza & Pasta 
        [imageurl] => sp_adrian.gif 
        [clickurl] => # 
       ) 

     ) 

    [6] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 55 
        [name] => 360South 
        [imageurl] => sp_360.jpg 
        [clickurl] => 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 37 
        [name] => Mordialloc Cellar Door 
        [imageurl] => sp_cellardoor.gif 
        [clickurl] => 
       ) 

     ) 

    [7] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 49 
        [name] => Kim Reed Conveyancing 
        [imageurl] => sp_kimreed.jpg 
        [clickurl] => 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 58 
        [name] => Dicount Lollie Shop 
        [imageurl] => new dls logo.jpg 
        [clickurl] => 
       ) 

     ) 

    [8] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 51 
        [name] => Richmond and Bennison 
        [imageurl] => sp_richmond.jpg 
        [clickurl] => http://www.richbenn.com.au/ 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 52 
        [name] => Mordialloc Travel and Cruise 
        [imageurl] => sp_morditravel.jpg 
        [clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html 
       ) 

     ) 

    [9] => Array 
     (
      [0] => stdClass Object 
       (
        [bid] => 50 
        [name] => Letec 
        [imageurl] => sp_letec.jpg 
        [clickurl] => www.letec.biz 
       ) 

      [1] => stdClass Object 
       (
        [bid] => 36 
        [name] => Big River 
        [imageurl] => sp_bigriver.gif 
        [clickurl] => 
       ) 

     ) 

) 

^^ 새롭게 생성 된 더 작은 배열의 원래 배열로부터.

나는 다차원 제거 중복 함수를 사용하여 중복을 제거 할 수 있다고 생각했지만 작동하지 않았습니다. 내 문제는 array_split 함수에있는 것 같아요.

제안 사항? :)

답변

7

EDIT : array_chunk이 있습니다.

글쎄, 나는 디버깅 같은 느낌하지 않았다, 그래서 나는 array_reduce와 버전을 썼다 :

$pergroup = 2; 
$redfunc = function ($partial, $elem) use ($pergroup) { 
    $groupCount = count($partial); 
    if ($groupCount == 0 || count(end($partial)) == $pergroup) 
     $partial[] = array($elem); 
    else 
     $partial[$groupCount-1][] = $elem; 

    return $partial; 
}; 

$arr = array(1,2,3,4,5); 

print_r(array_reduce($arr, $redfunc, array())); 

그냥 작업을 수행하는 array_chunk있다

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => 4 
     ) 

    [2] => Array 
     (
      [0] => 5 
     ) 

) 
+0

감사를 사용하여 두 배열의 모든 요소와 값을 가져올 수 있습니다 : 라인 (53)에 testing.php에 구문 오류, 예기치 T_FUNCTION : 구문 분석 오류 그 줄은 $ redfunc = function ($ partial, $ elem)입니다. ($ pergroup) { – SoulieBaby

+0

PHP 5.3.x를 사용하고 있지 않습니다. 일반 함수로 바꾸고 이름을 문자열로 array_reduce에 전달할 수 있습니다. – Artefacto

+0

그것을 시도하고 내가 어떻게 가는지 볼 수 있습니다 :) – SoulieBaby

1

나머지 항목의 배포는 너무 복잡합니다.

누락 된 항목 ($Remainder)을 알고있는 경우 비어있을 때까지 나머지 슬라이스와 팝업 항목을 array_pop()으로 생성하지 마십시오.

그런데 전체 어레이에도이 절차를 사용할 수 있습니다.

1
function split_array(&$array, $slices) { 
    $result = array(); 
    $l = count($array)-1; 
    for ($i=0; $i<=$l; $i++) { 
    if ($i == 0 || $i % $slices == 0) $tmp = array(); 
    $tmp[] = $array[$i]; 
    if ($i == $l || $i % $slices == 1) $result[] = $tmp; 
    } 
    return $result; 
} 
+0

@SoulieBaby : 나는 궁금한 점이 있습니다 ... 근본적으로 당신이 생각조차하지 않았거나 적어도 그것에 댓글을 달았습니다. – Tomalak

6
$sections = array_chunk(array('k', 'l', 'm', 'n', 'o'), 2); 
0

이 간단한 사용하십시오 [단지 더 명시 Artefacto의 대답의 두드러진 부분을]. 빈 문자열을 발견하면 배열을 두 개의 배열로 나눕니다. 하나는 빈 문자열 인덱스로 시작하는 것입니다. 기타 빈 문자열 인덱스에서 마지막.
참고 : Emty 문자열은 두 가지 모두에 포함되어 있지 않습니다. 조건 검사에만 사용됩니다.

$column[] = "id"; 
    $column[] = "name"; 
    $column[] = "email"; 
    $column[] = "password"; 
    $column[] = ""; 
    $column[] = "uid"; 
    $column[] = "uname"; 
    $column[] = "mname"; 
    $column[] = "lname"; 
    $column[] = "city"; 
    $column[] = "country"; 
    $column[] = "zip"; 
    $column[] = "cell"; 
    $column[] = "address"; 
    split_array($column); 

function split_array($column) 
{ 

    $total = count($column); 
    $num = array_search('',$column); 

    $split = $total - $num ; 
    $outer_sql = array_slice($column , - ($split) + 1); 
    array_splice($column , $num); 

    echo "<pre>"; 
    print_r($outer_sql); 
    echo "</pre>"; 
    echo "<pre>"; 
    print_r($column); 
    echo "</pre>"; 

} 
1

array_chunk 요소의 총 수를 원하는 청크 수로 나누어 않는 고르게 배열을 기입하지 않습니다 마지막 덩어리가 첫 번째 덩어리보다 훨씬 작을 수 있습니다 (예 : 7 개의 요소가 있고 3 개의 덩어리로 분할하면 3, 3 및 1 개의 요소가 포함 된 배열이 생성됩니다).

다음 구현은 이것을 원활하게하여 배열 크기를 늘리려는 시도입니다. 7 개의 요소가 있다면, 대신 3, 2, 2 개의 요소를 포함하는 청크 배열을 얻습니다. 여전히 평평하지는 않지만 더 평평합니다. 숫자가 열의 수에 따라 고르게 나눌 수 있다면 더 빠를 것이므로 array_chunk을 사용합니다 (특히 큰 배열이있는 경우).

<?php 
function array_group($array, $num)             
{                   
    $num = (int) $num;              
    if ($num < 1) {               
     throw new \InvalidArgumentException('At least one group must be returned.'); 
    }                  

    $count = count($array);             
    if ($count && $count % $num === 0) {          
     return array_chunk($array, $count/$num);       
    }                  

    $groups = [];               
    $offset = 0;                
    do {                  
     $length = ceil(($count - $offset)/$num);     
     $groups[] = array_slice($array, $offset, $length);     
     $offset += $length;            
    } while (--$num);              

    return $groups;               
} 

print_r(array_chunk(array(1, 2, 3, 4, 5, 6, 7), 3)); 
/* Produces 
Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 

    [1] => Array 
     (
      [0] => 4 
      [1] => 5 
      [2] => 6 
     ) 

    [2] => Array 
     (
      [0] => 7 
     ) 

) */ 

print_r(array_group(array(1, 2, 3, 4, 5, 6, 7), 3)); 
/* Produces 
Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 

    [1] => Array 
     (
      [0] => 4 
      [1] => 5 
     ) 

    [2] => Array 
     (
      [0] => 6 
      [1] => 7 
     ) 
) */ 
0

PHP 배열을 두 개의 동일한 섹션으로 나누는 간단한 방법입니다. 나는이 오류 받고 있어요하지만 당신은 foreach는 easity에게 그것에 대해

list($firstarray, $secondarray) = array_chunk($vorstand_two_column, ceil(count($all_array_contents)/2)); 

foreach($firstarray as $fa) { 
.... Code .... 
} 

foreach($secondarray as $sa) { 
.... Code .... 
} 
관련 문제