Utilisation de l'implosion pour regrouper les informations acquises dans une boucle while

StackOverflow https://stackoverflow.com/questions/1640617

  •  08-07-2019
  •  | 
  •  

Question

J'ai le problème suivant. J'ai les numéros 1/2/3/4/5/6 et je veux les séparer en deux groupes 1/3/5 et 2/4/6. La sélection doit avoir lieu en fonction de la position. Cette partie fonctionne bien. Le problème survient lorsque je souhaite les regrouper à nouveau, lorsque j'utilise la fonction implode. il ne voit que le dernier numéro enregistré. Je sais que cela a quelque chose à voir avec moi en utilisant cette notation (j'ai choisi cette méthode car la quantité de nombres à classer varie à chaque fois):

$q++;
$row0 = $row0 + 2;
$row1 = $row1 + 2;

mais je ne peux pas trouver un moyen de résoudre ce problème ou un autre moyen d'obtenir le même résultat. J'espère que quelqu'un ici pourra me diriger dans la bonne direction. J'ai laissé le code complet ci-dessous.

<?
$string = "1/2/3/4/5/6";
$splitted = explode("/",$string);
$cnt = count($splitted);
$q=0;
$row0=0;
$row1=1;
while($cnt > 2*$q)
{
  $p_row = implode(array($splitted[$row0]));
  echo "$p_row <br>";
  $i_row = implode(array($splitted[$row1]));
  echo "$i_row <br>";

  $q++;
  $row0 = $row0 + 2;
  $row1 = $row1 + 2;
}
$out = "implode(',', $i_row)";
var_dump($out);
?>
Était-ce utile?

La solution

Vous pouvez diviser le tableau en groupes en utilisant % sur l'index de la boucle. Placez chaque groupe dans un tableau séparé. Voici un exemple:

<?php
    $string = "1/2/3/4/5/6";
    $splitted = explode("/",$string);
    $group_odd = array();  ## all odd elements of $splitted come here
    $group_even = array(); ## all even elements of $splitted come here
    for ($index = 0; $index < count($splitted); ++$index) {
        ## if number is divided by 2 with rest then it's odd
        ## but we've started calculation from 0, so we need to add 1
        if (($index+1) % 2) { 
            $group_odd[] = $splitted[$index];
        }
        else {
            $group_even[] = $splitted[$index];
        }
    }
    echo implode('/', $group_odd), "<br />";  ## outputs "1/3/5<br />"
    echo implode('/', $group_even), "<br />"; ## outputs "2/4/6<br />"
    print_r($group_odd);
    print_r($group_even);
?>

Autres conseils

J'ai mal lu le problème, semble-t-il. Au lieu de cela, je donne cette optimisation.

$string = "1/2/3/4/5/6";
$splitted = explode("/", $string);
$group = array();
for ($index = 0, $t = count($splitted); $index < $t; ++$index) { 
    $group[$index & 1][] = $splitted[$index];
} 
$oddIndex = $group[0]; //start with index 1
$evenIndex = $group[1]; //start with index 2

echo "odd index:  " 
    . implode('/', $oddIndex) 
    . "\neven index: " 
    . implode('/', $evenIndex) 
    . "\n";

Basé sur leur position? Alors, divisez-vous en fonction de l'uniformité / de l'étrangeté de leur index dans le tableau?

Quelque chose comme ça?

<?php

$string = "1/2/3/4/5/6";

list( $evenKeys, $oddKeys ) = array_split_custom( explode( '/', $string ) );

echo '<pre>';
print_r( $evenKeys );
print_r( $oddKeys );

function array_split_custom( array $input )
{
  $evens = array();
  $odds = array();
  foreach ( $input as $index => $value )
  {
    if ( $index & 1 )
    {
      $odds[] = $value;
    } else {
      $evens[] = $value;
    }
  }
  return array( $evens, $odds );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top