2010-05-18 3 views
5

У меня есть функция, которая должна разделить мой массив на меньшие, равномерно распределенные массивы, однако, похоже, это дублирует мои данные на этом пути. Если кто-нибудь сможет мне помочь, это будет здорово.php split array в более мелкие массивы

Вот исходный массив:

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] => 
       ) 

     ) 

) 

^^ Как вы можете видеть, есть дубликаты icates из исходного массива во вновь созданных меньших массивах.

Я думал, что могу удалить дубликаты с помощью многомерной функции удаления дубликатов, но это не сработало. Я предполагаю, что моя проблема в функции 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 
(
    [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

+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

0

Try это простое использование. Когда он находит пустую строку, он разбивает массив на два массива. Один от начала до пустого индекса строки. Другое от пустого индекса строки до последнего.
Примечание: строка 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 .... 
}