Pregunta

Tengo el siguiente problema. Tengo los números 1/2/3/4/5/6 y quiero separarlos en dos grupos 1/3/5 y 2/4/6. La selección debe realizarse en función del puesto. Esta parte funciona bien. El problema surge cuando quiero agruparlos nuevamente, cuando uso la función implosionar; solo ve el último número almacenado. Sé que tiene algo que ver conmigo usando esta notación (elegí de esta manera ya que la cantidad de números para clasificar varía cada vez):

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

pero no puedo encontrar una manera de arreglarlo u otra forma de obtener el mismo resultado. Espero que alguien aquí pueda señalarme en la dirección correcta. Dejé el código completo a continuación.


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

¿Fue útil?

Solución

Puede dividir la matriz en grupos usando % en el índice de bucle. Ponga cada grupo en una matriz separada. Aquí hay un ejemplo:

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

Otros consejos

Leí mal el problema que parece. En cambio, doy esta optimización.

$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";

¿Según su posición? Entonces, ¿dividido en función de la uniformidad / impar de su índice en la matriz?

¿Algo como esto?

<?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 );
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top