Page 1 sur 1
déplacement dans un tableau
Posté : 01 oct. 2013, 15:39
par manue87
bonjour à tous,
j'ai un tableau initial de 12 valeurs :
0 1 2 3 4 5 6 7 8 9 10 11
j'ai transformé ce tableau en un tableau multi dimension : x lignes / 3 colonnes - array_chunck($montableau, 3);
col0 col1 col2
ligne0 0 1 2
ligne1 3 4 5
ligne2 6 7 8
ligne3 9 10 11
voici mon problème :
je dois comparer sur chaque ligne la colonne $i avec la colonne $i-1
si la valeur est différente (la variable étant un objet, il s'agit en fait d'un test sur une des clés, mais je ne pense pas que ca change la logique), je déplace tout à la ligne suivante
donc dans mon exemple, mettons que ligne 1/col0 soit différent de ligne 1/col1 ca donne ca :
col0 col1 col2
ligne0 0 1 2
ligne1 3
ligne2 4 5 6
ligne3 7 8 9
ligne4 10 11
je me noie dans les boucles et rien ne marche.
pouvez vous m'indiquer la voie ?
merci
E.
Re: déplacement dans un tableau
Posté : 01 oct. 2013, 18:30
par sirakawa
Suggestion simulation sur papier:
max_lignes := 4
max_col := 4
n_ligne := 0
n_colonne := 0 (ton $i)
val1:= tableau[n_ligne,n_colonne]
suivante := n_colonne+1
val2:= tableau[n_ligne,suivante]
si(val_1 <>val_2)
{
}
t[n_ligne,n_colonne] =0
Re: déplacement dans un tableau
Posté : 01 oct. 2013, 20:09
par moogli
pour être plus explicite il s'agit de l'emploi de double boucle qui me rappel les tp de base en C sur les matrices
ceci pour la gestion des boucles.
par contre à part le décalage après le 3 je ne vois pas de logique dans ton résultat.
car la tu va passer à la ligne suivante pour chaque colonne (d'après ce que tu dit) hors ce n'est pas ce qu'indique ton exemple résultat
@+
Re: déplacement dans un tableau
Posté : 01 oct. 2013, 20:11
par sirakawa
@moogli : moi non plus je ne vois pas bien le but de l'opération... Menfin...
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 10:36
par manue87
mon tableau contient des objets : des produits à afficher pour un site e-commerce
ces produits ont plusieurs attributs :
- catégorie
- image
- prix
- stock
je dois découper le tableau de résultat de la requete en base pour affichage correct dans mon template :
des lignes de 3 colonnes max
autant de lignes que de besoin (donc le nombre de lignes est variable et dépend du nombre de produits retournés)
je veux afficher ces produits par catégorie
j'ai donc fait un tri au préalable dans ma requete
on arrive à mon problème :
je veux passer a la ligne suivante si la catégorie change :
NON :
cat1 cat2 cat2
OUI :
cat1
cat2 cat2
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 10:48
par computarelier
Salut,
Pour chaque résultat :
est ce que la catégorie est identique à la précédente ?
- - - OUI : Combien d articles sont déjà présents sur la ligne ?
- - - - - - - : 1 ou 2 : on ajoute l'article sur la ligne
- - - - - - - : 3 : on ajoute une nouvelle ligne
- - - NON : On ajoute une nouvelle ligne
Qu'est ce que tu penses d'une solution comme ça ?
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 10:54
par manue87
ca conviendrait à ce que je veux faire, mais j'arrive pas à voir comment l'intégrer à mon code :
$mainareahtml = '<div class="showcase'.$jxtc.'">';
$index = 1;
$itemPages = array_chunk(array_slice($items,0,($columns*$rows*$pages)),($rows * $columns));
$itemPagesCount = count($itemPages);
$p=1;
foreach ($itemPages as $page) {
$mainareahtml .= '<div class="sframe'.$jxtc.'"';
if ($transmode == 'wind' || $transmode == 'winz' || $p > 1) {
$mainareahtml .= ' style="display:none"';
}
if ($itemPagesCount == 1) { $pageclass = 'singlepage'; } // Page class
elseif ($p == 1) { $pageclass = 'firstpage'; }
elseif ($p == $itemPagesCount) { $pageclass = 'lastpage'; }
else { $pageclass = 'centerpage'; }
$pageclass = ($p%2) ? 'oddpage '.$pageclass : 'evenpage '.$pageclass;
$mainareahtml .= '><table class="table'.$jxtc.' '.$pageclass.' page-'.$p.'" width="100%" cellpadding="0" cellspacing="0">';
$itemRows = array_chunk($page,$columns);
var_dump($itemRows);
$itemRowsCount = count($itemRows);
$r=1;
foreach ($itemRows as $row) {
if ($itemRowsCount == 1) { $rowclass = 'singlerow'; } // Row class
elseif ($r == 1) { $rowclass = 'firstrow'; }
elseif ($r == $itemRowsCount) { $rowclass = 'lastrow'; }
else { $rowclass = 'centerrow'; }
$rowclass .= ($r%2) ? ' oddrow' : ' evenrow';
$mainareahtml .= '<tr class="'.$rowclass.' row-'.$r.'">';
$itemColumnCount = count($row);
$c=1;
// ici pour test de la catégorie
// $test = array();
foreach ($row as $item) {
$itemhtml = $itemtemplate;
require JModuleHelper::getLayoutPath($module->module, 'default_parse');
if ($itemColumnCount == 1) { $colclass = 'singlecol'; } // Col class
elseif ($c == 1) { $colclass = 'firstcol'; }
elseif ($c == $itemColumnCount) { $colclass = 'lastcol'; }
else { $colclass = 'centercol'; }
$colclass .= ($c%2) ? ' oddcol' : ' evencol';
// EG : ajout de la catégorie du tour en cours pour comparaison avec la précédente et tentative infructueuse :
/*$test[$c] = $item->category_name;
if ($c>1) {
echo $c." : ";
echo "c = ".$test[$c]." et c-1 = ".$test[$c-1];
if ($test[$c] != $test[$c-1]) {
echo " -> c'est différent <br/>";
// c'est bon, ca sort bien de la boucle, mais ca n'affiche pas les catégories différentes
break 1;
}
else {
echo " -> c'est tout pareil <br/>";
}
}
*/
// c'est à ce niveau qu'on insere les produits dans les cases.......
$mainareahtml .= '<td class="'.$colclass.' col-'.$c.'" style="width:'.$cell_width.'%" >'.$itemhtml.'</td>';
$c++;
$index++;
}
$mainareahtml .='</tr>';
$r++;
}
$mainareahtml .= '</table></div>';
$p++;
}
$mainareahtml .= '</div>';
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 11:32
par computarelier
Regarde ça :
<table>
<?php
// soit $items tout tes articles (sous la forme d'un array)
// $item->category_name la categorie
// $item->titre_produit; le nom du produit
$titrecategorieproduitprecedent = false;
$numeroligneproduit = 0;
$nombreditems = count($items);
$nombreditemsentableau = 0;
// pour chaque item
foreach ($items as $monitem) {
if ($titrecategorieproduitprecedent === false)
// ne s'affichera qu'au premier tour pour être sur que notre tableau commence bien par un tr
echo '<tr>';
// si l item est de la meme categorie que la precedente
if ($monitem->category_name == $titrecategorieproduitprecedent) {
// les 2 items sont de la même cat = on continue
if ($numeroligneproduit < 3) {
// il y a moins de 3 produits affiches sur la meme ligne
// on ajoute sur la même ligne
$numeroligneproduit++;
} else {
// Sinon on ferme la ligne et on en cree une nouvelle
echo '</tr>'; // on ferme la ligne
echo '<tr>';
}
} else {
// c est une autre cat : donc nouvelle ligne
echo '<tr>';
}
// on affiche nos infos produits
echo '<td>' . $item->titre_produit . '</td>';
// si y'a plus d objets a afficher on ferme la ligne ouverte
if ($nombreditems = $nombreditemsentableau)
echo '</tr>';
$titrecategorieproduitprecedent=$monitem->category_name;
$nombreditemsentableau++;
}
?>
</table>
Est ce que tu comprends bien ?
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 11:48
par manue87
je vais tester
si je comprends bien, ca m'évite l'array chunck
je defile la liste et affiche les produits selon deux critères : la catégorie et le n° de la colonne
j'ai peur d'avoir des soucis avec l'affichage puisqu'il s'agit d'une view appelée par un module et donc toute la partie attribution de la classe css va etre difficile à intégrer :
foreach ($itemRows as $row) {
if ($itemRowsCount == 1) { $rowclass = 'singlerow'; } // Row class
elseif ($r == 1) { $rowclass = 'firstrow'; }
elseif ($r == $itemRowsCount) { $rowclass = 'lastrow'; }
else { $rowclass = 'centerrow'; }
$rowclass .= ($r%2) ? ' oddrow' : ' evenrow';
$mainareahtml .= '<tr class="'.$rowclass.' row-'.$r.'">';
Re: déplacement dans un tableau
Posté : 02 oct. 2013, 13:23
par computarelier
Bah... Je te souhaite bon courage alors ! Tiens nous au courant si ça va pas !

Re: déplacement dans un tableau
Posté : 03 oct. 2013, 14:55
par manue87
bonjour,
j'ai testé ta solution ainsi :
// soit $page tout tes articles (sous la forme d'un array)
// $item->category_name la categorie
// $item->titre_produit; le nom du produit
$titrecategorieproduitprecedent = false;
$numeroligneproduit = 0;
$nombreditems = count($page);
//echo $nombreditems;
$nombreditemsentableau = 0;
// pour chaque item
foreach ($page as $item) {
$itemhtml = $itemtemplate;
require JModuleHelper::getLayoutPath($module->module, 'default_parse');
echo "COL : ".$numeroligneproduit." /// ITEMS = ".$nombreditemsentableau." /// RES = ".$res." /// CAT = ".$item->category_name." /// CAT PREC = ".$titrecategorieproduitprecedent."<br/>";
if ($titrecategorieproduitprecedent === false) {
// ne s'affichera qu'au premier tour pour être sur que notre tableau commence bien par un tr
$mainareahtml .= '<tr>';
}
// si l item est de la meme categorie que la precedente
if ($item->category_name == $titrecategorieproduitprecedent) {
// les 2 items sont de la même cat = on continue
$res = "ok";
if ($numeroligneproduit < 3) {
// il y a moins de 3 produits affiches sur la meme ligne
// on ajoute sur la même ligne
$numeroligneproduit++;
$res.= " Ok";
} else {
// Sinon on ferme la ligne et on en cree une nouvelle
$mainareahtml .= '</tr>'; // on ferme la ligne
$mainareahtml .= '<tr>';
$res.= " Ko";
}
} else {
// c est une autre cat : donc nouvelle ligne
$mainareahtml .= '<tr>';
$res = "KO";
}
// on affiche nos infos produits
$mainareahtml .= '<td style="width:'.$cell_width.'%" >'.$itemhtml.'</td>';
// si y'a plus d objets a afficher on ferme la ligne ouverte
if ($nombreditems = $nombreditemsentableau) {
$mainareahtml .= '</tr>';
}
$titrecategorieproduitprecedent=$item->category_name;
$nombreditemsentableau++;
}
je vire chèvre : j'ai mis des affichages de resultat des tests :
COL : 0 /// ITEMS = 0 /// RES = /// CAT = Garden Tools /// CAT PREC =
COL : 0 /// ITEMS = 1 /// [b]RES = KO[/b] /// CAT = Garden Tools /// CAT PREC = Garden Tools
COL : 1 /// ITEMS = 2 /// RES = ok Ok /// CAT = Garden Tools /// CAT PREC = Garden Tools
COL : 2 /// ITEMS = 3 /// RES = ok Ok /// CAT = Hand Tools /// CAT PREC = Garden Tools
COL : 2 /// ITEMS = 4 /// RES = KO /// CAT = Hand Tools /// CAT PREC = Hand Tools
COL : 3 /// ITEMS = 5 /// RES = ok Ok /// CAT = Hand Tools /// CAT PREC = Hand Tools
COL : 3 /// ITEMS = 6 /// RES = ok Ko /// CAT = Hand Tools /// CAT PREC = Hand Tools
COL : 3 /// ITEMS = 7 /// RES = ok Ko /// CAT = Indoor Tools /// CAT PREC = Hand Tools
COL : 3 /// ITEMS = 8 /// RES = KO /// CAT = Outdoor Tools /// CAT PREC = Indoor Tools
COL : 3 /// ITEMS = 9 /// RES = KO /// CAT = Peintures Acryliques /// CAT PREC = Outdoor Tools
COL : 3 /// ITEMS = 10 /// RES = KO /// CAT = Peintures Acryliques /// CAT PREC = Peintures Acryliques
COL : 3 /// ITEMS = 11 /// RES = ok Ko /// CAT = Peintures Acryliques /// CAT PREC = Peintures Acryliques
COL : 3 /// ITEMS = 12 /// RES = ok Ko /// CAT = Power Tools /// CAT PREC = Peintures Acryliques
COL : 3 /// ITEMS = 13 /// RES = KO /// CAT = Power Tools /// CAT PREC = Power Tools
comme on le voit, le test renvoit KO au lieu de OK lorsque les categories sont identiques.
Au final j'ai l'affichage suivant :
A A
A
B
B
C
D
D
E
F
j'ai beau tourner le truc dans tous les sens....
Re: déplacement dans un tableau
Posté : 03 oct. 2013, 15:31
par manue87
RESOLU :
$col = 1;
$previous_value = '';
$ncol = 3;
$mainareahtml .= '><table class="table'.$jxtc.' '.$pageclass.' page-'.$p.'" width="100%" cellpadding="0" cellspacing="0"><tr>';
foreach ($page as $item) {
$itemhtml = $itemtemplate;
require JModuleHelper::getLayoutPath($module->module, 'default_parse');
// echo 'col' . $col;
// echo 'cur' . $previous_value;
// echo 'value' . $item->category_name;
// echo '<br/>';
if ($previous_value !== '' && $previous_value != $item->category_name) {
for ($i = 0; $i <= ($ncol - $col); $i++) {
$mainareahtml .= '<td> </td>';
}
$col = 1;
$mainareahtml .= '</tr>';
}
$mainareahtml .= '<td style="width:'.$cell_width.'%" >'.$itemhtml.'</td>';
if ($col == $ncol) {
$previous_value='';
$col = 1;
$mainareahtml .= '</tr><tr>';
}
else {
$col++;
$previous_value = $item->category_name;
}
}
// finalisation du tableau
if ($col != $ncol + 1) {
for ($i = 0; $i <= ($ncol - $col); $i++) {
$mainareahtml .= '<td> </td>';
}
$mainareahtml .= '</tr>';
}
$mainareahtml .= '</table>';