2010-05-18 61 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] => 
       ) 

     ) 

) 

^^正如你可以看到有dupl新創建的較小陣列中原始數組的原始數據。

我想我可以刪除使用多維刪除重複功能的副本,但沒有奏效。我猜我的問題是在array_split函數。

有什麼建議嗎? :)

回答

7

編輯:有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 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
     ) 

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

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

) 
+0

感謝,你可以取兩個數組中的所有元素和價值,雖然我得到這個錯誤: 解析錯誤:語法錯誤,意想不到的T_FUNCTION在testing.php在線53 該行爲$ redfunc = function($ partial,$ elem)use($ pergroup){ – SoulieBaby 2010-05-18 22:50:47

+0

您沒有使用PHP 5.3.x您可以用普通函數替換它,並將其名稱作爲字符串傳遞給array_reduce。 – Artefacto 2010-05-18 22:55:03

+0

會嘗試,看看我怎麼走:) – SoulieBaby 2010-05-18 23:00:36

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 2010-05-19 07:15:23

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

試試這個簡單的用法。當它找到空字符串時,它將數組分成兩個數組。一個從開始到空字符串索引。其他從空字符串索引到最後一個。
注意: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不填充均勻數組元素,除非的總數是你想要的組塊數整除;最後一個塊可能比第一個塊小得多(例如,如果你有七個元素並且你分成三個塊,你將得到包含三個,三個和一個元素的數組)。

下面的實現將嘗試平滑此過程,以便數組的大小更加均勻,如果這就是您要的數組大小。如果你有七個元素,你會得到包含三個,兩個和兩個元素的塊數組。它仍然不是,但更均勻。如果計數可以被列的數量整除,那麼它會回落到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 .... 
}