2010-05-18 8 views
5

Mam funkcję, która ma podzielić moją tablicę na mniejsze, równomiernie rozmieszczone tablice, jednak wydaje mi się, że duplikuję moje dane po drodze. Jeśli ktokolwiek może mi pomóc, to byłoby wspaniale.php dzieli tablicę na mniejsze nawet tablice

Oto oryginalna tablica:

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

) 

Oto funkcja php, która jest przeznaczona do podziału tablicy:

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; 
    } 

tutaj jest wynikiem podziału (w jakiś sposób powiela elementy z oryginalnej tablicy do mniejszych tablic):

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

     ) 

) 

^^ Jak widać są dupl pochodzi z oryginalnej tablicy w nowo utworzonych mniejszych tablicach.

Pomyślałem, że mogę usunąć duplikaty za pomocą wielowymiarowej funkcji usuwania duplikatów, ale to nie zadziałało. Zgaduję, że mój problem jest w funkcji array_split.

Wszelkie sugestie? :)

Odpowiedz

7

EDYCJA: Jest array_chunk, który właśnie to robi.

Cóż, nie miałem ochoty debugowania, więc napisałem wersję z 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())); 

daje

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

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

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

) 
+0

Dzięki za to, chociaż ja dostaję ten błąd: Parse error : błąd składni, nieoczekiwany T_FUNCTION w testing.php on line 53 Ta linia to $ redfunc = funkcja ($ partial, $ elem) use ($ pergroup) { – SoulieBaby

+0

nie używasz PHP 5.3.x Możesz zastąpić ją zwykłą funkcją i przekazać jej nazwę jako ciąg do array_reduce. – Artefacto

+0

spróbuję tego i zobaczę, jak poszedłem :) – SoulieBaby

1

Wydaje mi się, że dystrybucja pozostałych pozycji jest zbyt skomplikowana.

Jeśli wiesz, ile elementów brakuje ($Remainder), dlaczego nie możesz po prostu wygenerować pozostałego plasterka i wyskakujących elementów za pomocą array_pop(), dopóki nie będzie pusta?

Nawiasem mówiąc, możesz użyć tej procedury również dla całej tablicy.

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: Zastanawiam się ... czy jest coś fundamentalnie nie tak z tą odpowiedzią, której nawet nie rozważałeś, a przynajmniej nie komentowałeś? – Tomalak

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

wypróbować ten prosty zwyczaj. Po znalezieniu pustego łańcucha dzieli tablicę na dwie tablice. Jeden z początku do pustego indeksu ciągów. Inne z pustego indeksu napisów do ostatniego.
Uwaga: Ciąg Emty nie jest zawarty w obu. służy tylko do sprawdzania stanu.

$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 nie wypełnia tablice równomiernie, chyba że łączna liczba elementów jest podzielna przez liczbę kawałków, które chcesz; ostatnia porcja może być znacznie mniejsza niż pierwsza (np. jeśli masz siedem elementów i podzielisz się na trzy części, otrzymasz tablice zawierające trzy, trzy i jeden element).

Następująca implementacja będzie próbować wygładzić to, aby rozmiary macierzy były bardziej równomierne, jeśli tego właśnie szukasz, np. jeśli masz siedem elementów, zamiast tego otrzymasz tablice zawierające trzy, dwa i dwa elementy. Wciąż nie jest równy, ale jest bardziej równomierny. Powraca do używania array_chunk, jeśli liczba jest równomiernie podzielna przez liczbę kolumn, ponieważ będzie to szybsze (szczególnie, jeśli masz duże tablice).

<?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

Jest to prosty sposób na podzielenie tablicy php na dwie równe części. i można pobrać wszystkie elementy i wartości obu tablicach używając 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 .... 
} 
Powiązane problemy