2010-05-18 9 views
5

Tengo una función que se supone que divide mi matriz en matrices más pequeñas y distribuidas uniformemente, sin embargo, parece estar duplicando mis datos a lo largo del camino. Si alguien puede ayudarme, sería genial.php divide el conjunto en matrices pares más pequeñas

Aquí está la matriz original:

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

) 

Aquí está la función de PHP que está destinado a dividir la matriz:

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

Aquí está el resultado de la división (de alguna manera duplica los elementos de la matriz original en las matrices más pequeñas):

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

     ) 

) 

^^ Como puedes ver, hay dupl de la matriz original en las matrices más pequeñas creadas recientemente.

Pensé que podría eliminar los duplicados utilizando una función de eliminación de duplicados multidimensional, pero eso no funcionó. Supongo que mi problema está en la función array_split.

¿Alguna sugerencia? :)

Respuesta

7

EDITAR: Hay array_chunk, que hace precisamente eso.

Bueno, yo no tenía ganas de depuración, así que escribió una versión con 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())); 

da

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

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

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

) 
+0

Gracias por que, a pesar de que estoy recibiendo este error: Parse error: error de sintaxis, T_FUNCTION inesperado en testing.php en la línea 53 Esa línea es $ redfunc = function ($ partial, $ elem) use ($ pergroup) { – SoulieBaby

+0

no está usando PHP 5.3.x Puede reemplazarlo con una función normal y pasar su nombre como una cadena a array_reduce. – Artefacto

+0

lo intentaré y ver cómo voy :) – SoulieBaby

1

Me parece que la distribución de los elementos restantes es demasiado complicada.

Si sabe la cantidad de elementos que faltan ($Remainder), ¿por qué no genera un segmento restante y artículos extraíbles con array_pop() hasta que esté vacío?

Por cierto, puede usar ese procedimiento para toda la matriz también.

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: Me pregunto ... ¿hay algo fundamentalmente erróneo en esa respuesta que ni siquiera has considerado, o al menos comentado? – Tomalak

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

probar este un uso sencillo. Cuando encuentra cadena vacía, divide la matriz en dos matrices. Uno desde el principio al índice de cadena vacía. Otro desde el índice de cadena vacía hasta el último.
Nota: La cadena Emty no está incluida en ambos. se usa solo para verificar la condición.

$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 no llena los arrays de manera uniforme a menos que el número total de elementos es divisible por el número de fragmentos que desee; el último trozo puede ser mucho más pequeño que el primero (por ejemplo, si tiene siete elementos y se divide en tres trozos, obtendrá matrices que contienen tres, tres y un elemento).

La siguiente implementación intentará suavizar esto para que los tamaños de matriz sean más uniformes si eso es lo que busca, p. Ej. si tienes siete elementos obtendrás conjuntos de fragmentos que contienen tres, dos y dos elementos en su lugar. Todavía no es uniforme, pero es más uniforme. Se recurre al uso de array_chunk si el recuento es uniformemente divisible por el número de columnas, ya que será más rápido (especialmente si tiene matrices grandes).

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

Es una manera simple de dividir php array en dos secciones iguales. y se puede recuperar todos los elementos y valores de ambas matrices usando 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 .... 
} 
Cuestiones relacionadas