[RESOLU] déplacement dans un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] déplacement dans un tableau

Re: déplacement dans un tableau

par manue87 » 03 oct. 2013, 15:31

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>&nbsp;</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>&nbsp;</td>';
	}
	$mainareahtml .=  '</tr>';
}
$mainareahtml .=  '</table>';

Re: déplacement dans un tableau

par manue87 » 03 oct. 2013, 14:55

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

par computarelier » 02 oct. 2013, 13:23

Bah... Je te souhaite bon courage alors ! Tiens nous au courant si ça va pas ! :-)

Re: déplacement dans un tableau

par manue87 » 02 oct. 2013, 11:48

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

par computarelier » 02 oct. 2013, 11:32

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

par manue87 » 02 oct. 2013, 10:54

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

par computarelier » 02 oct. 2013, 10:48

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

par manue87 » 02 oct. 2013, 10:36

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

par sirakawa » 01 oct. 2013, 20:11

@moogli : moi non plus je ne vois pas bien le but de l'opération... Menfin...

Re: déplacement dans un tableau

par moogli » 01 oct. 2013, 20:09

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

par sirakawa » 01 oct. 2013, 18:30

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

déplacement dans un tableau

par manue87 » 01 oct. 2013, 15:39

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.