Pregunta

Tengo productos que se mostrarán horizontalmente en la página de la cuadrícula, sin embargo, quiero que se clasifiquen verticalmente y tengo 4 coulmns
Si tuviéramos una matriz simple, la salida es

1  2 3 4
5  6 7 8
9 10 11 12

Quiero que la salida sea

1 4 7 10
2 5 8 11
3 6 9 12

Escribí una página de prueba sin una matriz simple, quiero hacer esto en la matriz de productos, pero realmente no sé cómo hacerlo. Porque tengo una variedad de productos que se cargarán y debo cambiar el orden de ellos. ¿Tiene usted alguna otra idea?

gracias de antemano

<?php
$array1=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);
$column=4;
$count=count($array1);
$arr=array();
$k=intval($count/4);
$r=($count%4);
$num=0;
for($m=0; $m<4;$m++)
    for($n=0;$n<$k;$n++)
    {
        $arr[$m][$n]=$array1[$num];
    $num++;
    }
    /* 
     * build the remainders
     */
    for($i=0;$i<$r;$i++)
    {
        $arr[4][$i]=$array1[$num];  
        $num++;
    }
        //print the result
echo "<table>";
for($j=0;$j<$k;$j++)
{
echo "<tr>";

    for($i=0;$i<=4;$i++)
    {

    if($i==4 && $j<$r)
        {
            echo "<td>".$arr[$i][$j]."</td>";
        }
        else if($i!=4)
        echo "<td>".$arr[$i][$j]."</td>";   
    }
        echo "</tr>";
}
echo "</table>";
echo "arraysize is ".$count."<br>";
echo "division answer is".$k."<br>";;
echo "remainder is".$r;
?>

Aquí está la parte list.phtml

$_productCollection=$this->getLoadedProductCollection();
       <ol class="products-list" id="products-list">
        <?php foreach ($_productCollection as $_product): 

Entonces, la matriz de productos $ _ debe mostrarse verticalmente

                <?php // Product Image ?> 
                <a href="<?php echo $_product->getProductUrl() ?>"
//some other code
¿Fue útil?

Solución

No es tan difícil de hacer, en realidad. Ayuda a pensar en esto fuera del contexto de Magento como lo hizo anteriormente; Pero su método podría simplificarse1, 2:

<?php

$cols       = 5; //set this to the # columns you want
$count      = 55;//number of total records
$list       = range(1,$count);
$rowLength  = ceil($count/$cols);
$array      = array();


$output = array_chunk($list, $rowLength);

for($i=0;$i<$rowLength;$i++){
    @array_walk($output,function($val) use ($i){
        echo $val[$i] . ' ';
    });
    echo PHP_EOL;
}

Que, cuando se calcula para 5 columns y 32 count usted obtiene:

1 8 15 22 29
2 9 16 23 30
3 10 17 24 31
4 11 18 25 32
5 12 19 26
6 13 20 27
7 14 21 28

Todo lo que está sucediendo aquí es que el $list Array (un sustituto de su colección Magento) se está quedando en múltiples matrices dimensionados por $rowLength. ¡Después de eso, todo lo que estamos haciendo es iterar a través de todas las columnas y generar el índice de fila en ese valor de columna! Eso es muy bonito.

enter image description here

Haz esto en Magento

Cargue la colección y elige una matriz:

$collection = Mage::getModel('catalog/product')->getCollection()->setPageSize(20);
$array = $collection->toArray();

Luego lo conectamos a nuestro método que usa array_chunk3:

$collection = Mage::getModel('catalog/product')->getCollection()->setPageSize(20)->load();
$collArray = $collection->toArray();

$cols       = 5; //set this to the # columns you want
$count      = count($collArray);//number of total records
$rowLength  = ceil($count/$cols);
$array      = array();

$output = array_chunk($collArray, $rowLength);

for($i=0;$i<$rowLength;$i++){
    @array_walk($output,function($val) use ($i){
        echo $val[$i]['sku'] . ' '; //echoing sku in the array 
    });
    echo PHP_EOL;
}

En este caso, estoy haciendo eco de la SKU, pero en lugar de emitir un echo En su lugar, podría llenar una matriz de salida o incluso un Varien_Data_Collection Entonces puedes hacer uso de esto más tarde.

¡Espero que eso ayude! La mejor de las suertes.


  1. Los errores están siendo suprimidos porque estamos tratando de acceder a una clave inexistente (en el caso de las celdas en blanco)
  2. El uso de array_walk En estos ejemplos es trivial y podría reemplazarse con un bucle. Sin embargo, si estaba haciendo algo más profundo o tenía un método de bloque que ya manejaba cómo compilar filas de los valores de la columna, esta sería una solución apropiada.
  3. Nuevamente, los errores se suprimen aquí. Podrías en lugar de lanzar un intento de matriz de recuperarlo a través de la identificación de la recolección. O, mejor aún, proteja la condición probando si isset antes de hacer eco.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top