8797 sujets

Développement web côté serveur, CMS

bonjour,

j'éssaye désespérement de trouver le bon algorythme


$array_a = array('a','b','c');
$array_b = array('1','2','3','4','5','6','7','8');

$i=0;
while($i<sizeof($array_b))
{
	
	for ($j=0 ; $j < sizeof($array_a) ; $j++){
	echo "<pre>";
	echo $array_b[$i] . $array_a[$j];
	echo "</pre>";
	}
$i++;
}

qui me donne comme résultat 1a 1b 1c 2a 2b 2c etc...

comment faire pour arriver à ce résulat:

1a
2b
3c
4a
5b
6c
7a
etc...


merci Smiley biggrin
Modifié par julien67 (16 Oct 2012 - 19:33)
Modérateur
Salut,

utiliser un modulo !
<<<EDIT
Ryle a fait un petit post sur php France à ce sujet :[Tuto][PHP] Nombre de Colonnes dynamique (opérateur Modulo)
EDIT;

Ca ferait un truc comme :

<?php
    $array_a = range('a','c');
    $array_b = range(1,8);
    for ($i = 0; $i < count($array_b); $i++) {
        $modulo = $i % count($array_a);
        echo $array_b[$i].$array_a[$modulo].'<br />';
    }

Modifié par niuxe (17 Oct 2012 - 00:06)
Ou autre moyen :

<?php
    $array_a = range('a','c');
    $array_b = range(1,8);

    foreach($array_b as $b){
        foreach($array_a as $a){
            echo $b.$a."<br/>";
        }
    }
?>


Mais je sais pas si au niveau des performances, le code proposé avant n'est pas mieux...
Modifié par Apoooo (17 Oct 2012 - 08:52)
Modérateur
Apoooo a écrit :
Ou autre moyen :

<?php
    $array_a = range('a','c');
    $array_b = range(1,8);

    foreach($array_b as $b){
        foreach($array_a as $a){
            echo $b.$a."<br/>";
        }
    }


Mais je sais pas si au niveau des performances, le code proposé avant n'est pas mieux...


2 boucles et ton code donnerait (même souci que Julien67):

1a
1b
1c
2a
2b
2c
etc.


Le modulo reste simple et efficace -> KISS et même DRY

Après on peut faire une variante de ce que j'ai proposé plus haut :

    $array_a = range('a','c');
    $array_b = range(1,8);
    $j = 0;
    for ($i = 0; $i < count($array_b); $i++) {
        $j = $j < count($array_a) ? $j : 0;
        
        echo $array_b[$i].$array_a[$j]."<br/>";
        if($j < count($array_a)){
            $j++;  
        } 
    }

Modifié par niuxe (17 Oct 2012 - 09:45)
niuxe a écrit :

2 boucles et ton code donnerait (même souci que Julien67):
[code]
1a
1b
1c
2a
2b
2c
etc.


Ah oui, j'ai lu trop vite le résultat voulu, je pensais que c'est ce qu'il souhaitait faire Smiley biggol


$array_a = array('a','b','c');
$array_b = array('1','2','3','4','5','6','7','8');

$cnt = count($array_a);

for($i = 0; $i < count($array_b); $i++)
{
  $key_a = ( $i - ( floor($i / $cnt) * $cnt ) ); // égal à $i % $cnt
  echo $array_b[$i].$array_a[$key_a];
}



Ps: un bon calcul vaut toujours mieux qu'une mauvaise boucle Smiley cligne
Modifié par JJK801 (17 Oct 2012 - 10:12)
Pareil que Niuxe mais avec un foreach (parce que c'est toujours plus pratique qu'un for pour parcourir un tableau).


$array_a = array('a', 'b', 'c');
$array_b = array('1', '2', '3', '4', '5', '6', '7', '8');

$size_a = count($array_a);

foreach ($array_b as $k => $v) {
  echo $array_b[$k] . $array_a[$k % $size_a] . '<br />';
}

Modifié par jb_gfx (17 Oct 2012 - 15:44)
merci, en effet avec le modulo, çà le fait

for ($i = 0; $i < count($array_b); $i++)
{
    echo $array_b[$i] . $array_a[$i % count($array_a)];
}