[RESOLU] déplacement dans un tableau

Petit nouveau ! | 6 Messages

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.

Mammouth du PHP | 2278 Messages

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

01 oct. 2013, 20:11

@moogli : moi non plus je ne vois pas bien le but de l'opération... Menfin...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 6 Messages

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

Eléphant du PHP | 116 Messages

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 ?
@+,
Computarelier

Petit nouveau ! | 6 Messages

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

Eléphant du PHP | 116 Messages

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 ?
@+,
Computarelier

Petit nouveau ! | 6 Messages

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.'">';

Eléphant du PHP | 116 Messages

02 oct. 2013, 13:23

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

Petit nouveau ! | 6 Messages

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

Petit nouveau ! | 6 Messages

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