Как дать различное значение переменной для каждой итерации?


$azul = "#4285f4"; // Azul
$verde = "#34a853"; // Verde
$amarillo = "#fbbc05"; // Amarillo
$rojo = "#ea4335"; // Rojo
$color = rand(1, 4);

Я использую $color и внутри loop но это настолько просто, что это мой код, значение переменной повторяется, тип: 3, 3, 1.

Как сделать так, чтобы в 3 iteraciones значение не повторялось? формирующ последовательности типа 1, 2, 3, 1, 3, 2, 3, 2, 1, 3, 1, 2, и т. д ...

while ( $destacados->have_posts() ) {

     if($color == 1) { $color = $azul; }
     elseif ($color == 2) { $color = $verde; }
     elseif ($color == 3) { $color = $amarillo; }
     elseif ($color == 4) { $color = $rojo; }
}

оригинальный вопрос (португальский) : Как приписать различное значение различному в каждом цикле? - Стек переполняет их. - Я не знаю, - сказал он.

 18
php
Author: Comunidad, 2015-12-07

2 answers

Предполагая, что существует массив с именем $colores размера k, и вы хотите заполнить массив $colores_aleat размера N, я могу придумать два возможных случая:

  1. Если N <= k, то просто сделайте перестановку $colores и возьмите первые N элементы этой перестановки.
  2. Если N > k, то вы должны генерировать p = N / k перестановки (округленные до верхнего целого числа), и "объединить" p перестановки, и взять первые N входы

Давайте посмотрим, если это работает:

$colores = array("rojo", "verde", "azul", "amarillo");
$k = count($colores);
$N = 10;  // Valor de ejemplo; el array $colores_aleat tendrá $N entradas
if($N <= $k) {
    /*
      Si el número de colores a obtener es menor o igual que el número de colores disponibles
      basta con obtener los primeros $N elementos de una permutación de $colores
     */
    $colores_aleat = array_slice(shuffle($colores), 0, $N);
} else {
    /*
      Si el número de colores a obtener es mayor que el número de colores disponibles
      entonces hay que llenar el arreglo con permutaciones sucesivas
     */
    $colores_aleat = array();
    $p = ceil($N / $k);
    for($i = 1; $i <= $p; $i++) {
        $colores_aleat = array_merge($colores_aleat, shuffle($colores));
    }
    $colores_aleat = array_slice($colores_aleat, 0, $N);
}

Возможно, это не самая эффективная вещь, но она работает.

Надеюсь, это полезно.

 12
Author: Barranka, 2015-12-08 22:12:08

Вы определяете цветовое расположение вместо переменных независимо и используете метод shuffle, чтобы изменить их положение, а затем с помощью array_shift() вы удаляете то, что вы больше не используете, следующим образом:

<?php
$colores = ["#4285f4", "#34a853", "#fbbc05","#ea4335"];
shuffle($colores);

$i = 0;
$tot = count($colores);

while($i < $tot){
  echo array_shift($colores);
  $i++;
}
 10
Author: Juan Ruiz de Castilla, 2015-12-09 15:33:35