Frage

Ich habe Produkte, die sie horizontal auf der Gitterseite gezeigt werden, aber ich möchte, dass sie vertikal sortiert werden und ich habe 4 Coulmns
Wenn wir ein einfaches Array hätten, ist der Ausgang

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

Ich möchte, dass die Ausgabe ist

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

Ich habe eine Testseite ohne Magento ein einfaches Array geschrieben. Ich möchte dies für Produkte tun, aber ich weiß wirklich nicht, wie es geht? Weil ich eine Reihe von Produkten habe, die geladen werden und ich die Reihenfolge ändern sollte. Hast du eine andere Idee?

vielen Dank im Voraus

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

Hier ist der Teil list.phtml

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

Das $ _product -Array sollte also vertikal angezeigt werden

                <?php // Product Image ?> 
                <a href="<?php echo $_product->getProductUrl() ?>"
//some other code
War es hilfreich?

Lösung

Eigentlich ist es nicht so schwierig. Es hilft, außerhalb des Kontextes von Magento darüber nachzudenken, wie Sie es oben getan haben. Ihre Methode könnte jedoch vereinfacht werden1, 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;
}

Was, wenn er für 5 berechnet wird columns und 32 count du erhältst:

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

Alles was hier passiert ist, dass die $list Array (ein Stand-in für Ihre Magento-Sammlung) wird in mehreren Arrays von großer Größe von der Größe begleitet $rowLength. Danach sind wir nur durch alle Spalten durchzusetzen und den Zeilenindex zu diesem Spaltenwert auszugeben! Das ist ziemlich toll.

enter image description here

Mach das in Magento

Laden Sie die Sammlung auf und werfen Sie sie in ein Array:

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

Dann schließen wir es an unsere Methode an, die verwendet 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;
}

In diesem Fall spiegele ich nur die SKU aus, sondern anstatt eine auszugeben echo Sie können stattdessen ein Ausgangsarray oder sogar a bevölkern Varien_Data_Collection Sie können dies später nutzen.

Ich hoffe das hilft! Viel Glück.


  1. Fehler werden unterdrückt, weil wir versuchen, auf einen nicht vorhandenen Schlüssel zuzugreifen (bei leeren Zellen)
  2. Die Verwendung von array_walk In diesen Beispielen ist trivial und kann durch eine Schleife ersetzt werden. Wenn Sie jedoch etwas ausführlicheres gemacht haben oder eine Blockmethode hatten, die bereits mit der Kompilierung von Zeilen aus Spaltenwerten zusammengestellt wurde, wäre dies eine geeignete Lösung.
  3. Auch hier werden hier Fehler unterdrückt. Sie könnten anstatt zu einem Array -Versuch zu wirken, es über eine Sammel -ID abzurufen. Oder, noch besser, die Bedingung durch Testen, wenn es testet isset vor Echo.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top