2

Obtengo el siguiente array , están todos los datos separados por un * , he intentado usar explode e implode sin resultados , creo que se necesita algo mas complejo para resolverlo uso php 5.6

Array
       (
        [0] => 
        [1] => 1
        [2] => Dato2
        [3] => Dato3
        [4] => Dato4 
        [5] => 
        [6] => Dato6
        [7] => Dato7
        [8] => Dato8
        [9] => Dato9
        [10] => *
        [11] => 2
        [12] => Dato2
        [13] => Dato3
        [14] => Dato4 
        [15] => 
        [16] => Dato6
        [17] => Dato7
        [18] => Dato8
        [19] => Dato9
        [20] => *

    )

Quisiera separar por "*" y que se vea de la siguiente forma

Array
    (
    [0] => stdClass Object
        (
            [1] => 1
            [2] => Dato2
            [3] => Dato3
            [4] => Dato4 
            [5] => 
            [6] => Dato6
            [7] => Dato7
            [8] => Dato8
            [9] => Dato9
        )

    [1] => stdClass Object
        (
            [11] => 2
            [12] => Dato2
            [13] => Dato3
            [14] => Dato4 
            [15] => 
            [16] => Dato6
            [17] => Dato7
            [18] => Dato8
            [19] => Dato9
        )
    )

Gracias por su atención estaré atento a sus respuestas saludos.

1
  • El segundo objeto debe empezar por 11? No tendría más sentido que todos los objetos empezaran por 0?
    – Julio
    Commented el 8 ago. 2018 a las 16:32

3 respuestas 3

2

Seria algo asi:

<?php
$array = [1,'dato1','dato2','*',2,'dato3','dato4','*'];
$objects = array();
$object = array();
foreach ($array as $i => $val) {
    if ($val == '*') {
        $objects[] = $object;
        $object = array();
    } else {
        $object[] = $val;
    }
}
var_dump($objects);
?>
2
  • 1
    No acaba de tener la misma salida que en el ejemplo porque en el ejemplo los objetos mantienen el índice original mientras que aquí siempre empiezan en 0 (cosa que tiene más sentido). Pero a ver si @javier-antonio-aguayo-aguilar nos lo aclara
    – Julio
    Commented el 8 ago. 2018 a las 16:34
  • 1
    Me funciono gracias ! Commented el 9 ago. 2018 a las 13:31
1

Si quieres mantener las llaves haría algo así:

$array =["","1","Dato2","Dato3","Dato4","","Dato6","Dato7","Dato8","Dato9","*","2","Dato2","Dato3","Dato4",""]

$array_out = array();
$array_tmp = array();

foreach($array as $key=>$value)
{
   if(trim($value) != "*")
   { 
      $array_tmp[$key] = $value;
   }
   else
   { 
      array_push($array_out, $array_tmp);
      $array_tmp = array();
   }
} 
1

dado un array original:

<?php

$array_original = [
    '',
    1,
    'Dato2',
    'Dato3',
    'Dato4',
    '',
    'Dato6',
    'Dato7',
    'Dato8',
    'Dato9',
    '*',
    2,
    'Dato2',
    'Dato3',
    'Dato4',
    '',
    'Dato6',
    'Dato7',
    'Dato8',
    'Dato9',
    '*',
];

más un array final que empieza vacío:

$array_final = [];

Y un índice de referencia para el subconjunto de datos dentro del array final:

$index_objeto = 0;

Puedes iterar sobre el array original insertando datos al subconjunto correspondiente. Cada vez que encuentres un * en vez de insertar el dato en el subconjunto, actualizas $index_objeto.

Ahora, tú quieres que la salida final sea un array de objetos y no un array de arrays, por lo que cada vez que creas un subconjunto debes castearlo a stdClass

$array_final[$index_objeto] = (object) [];

De manera que la iteración quedaría:

foreach ($array_original as $index => $value) {
    if ($value === '*') {

        // si * es el primer elemento, no incremento el subconjunto
        if( $index!==0 ) { 
          $index_objeto++;
        }
    } else {
        // declaro el nuevo objeto en la iteración siguiente al *
        if (!array_key_exists($index_objeto, $array_final)) {
            $array_final[$index_objeto] = (object) [];
        }
        $array_final[$index_objeto]->$index = $value;
    }
}

Hay entonces cuatro cosas que notar en la respuesta:

  1. El subconjunto dentro de $array_final debe castearse usando (object)
  2. La asignación a éste debe usar un operador de objeto $objeto->propiedad = valor en vez de un operador de array $array[propiedad] = valor.
  3. Sólo incremento $index_objeto cuando el valor es * y éste no está en la primera posición, para evitar que la respuesta final contenga objetos vacíos.
  4. De la misma manera, si encuentro un * declaro el nuevo objeto en la iteración siguiente, por si acaso no hay nada más en el array y, de nuevo, no quiero terminar con objetos vacíos

Puedes verlo funcionando en: https://www.tehplayground.com/1nY2ajWeZc95leIp

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.