TransWikia.com

¿Es posible hacer que el bucle foreach itere sobre el objeto a partir de un parametro dado?

Stack Overflow en español Asked by idunno on November 17, 2021

Estoy haciendo un sistema de estadísticas que permite al usuario que se registró ver sus datos. Estos mismos son devueltos por una API.

Cuestión que OBVIAMENTE al ser un objeto, nuestro bucle foreach() va a iterar sobre todas las propiedades del mismo.

Estaba pensando en utilizar funciones tales como strstr() que justamente se encarga de encontrar la primera aparicion de un string. Pero no se como usarlo dentro de la semantica del bucle.

Aquí una muestra de mi codigo:

$almacen = llamadaApi();
                    if(is_array($almacen) || is_object($almacen)){
                            foreach($almacen as $index => $valores){
                                foreach ($valores as $params) {
                                    $avatar = $params->avatar;
                                    $nombre_uesva = $params->name;
                                    $subs = strstr($almacen, $nombre);
                                    var_dump($subs); // Cabe resaltar que estuve haciendo pruebas por corazonadas
                                    if($subs = $nombre_uesva){
                                    $millas = $valores->millas[$subs];

                                    }
                                }
                                

                            }
                                    echo '<div class="millas_piloto_fdsp">';
                                    echo '<b id="casillaMillas">Millas Voladas: ' . $millas;
                                    echo '</b>';
                                    echo '</div>';
                                    echo '<div class="avatar_piloto_fdsp">';
                                    echo '<img id="imagen_piloto" src="'.$avatar.'">';
                                    echo '</div>';

Y mas abajo, una muestra de ejemplo de mi objeto.

stdClass Object
(
    [ernor] => 0
    [created] => 2020-05-07 00:00:26
    [result] => Array
        (
            [0] => stdClass Object
                (
                    [id] => XXXX
                    [name] => Pepe Argento
                    [country] => CO
                    [avatar] => XXX
                    [scoreRating] => 104,00
                    [pilotRating] => Estudiante
                    [imageRating] => XXX
                    [lastLoginDate] => 2020-05-01
                    [lastLoginTime] => 06:35:11
                    [UesvaRegisteredDate] => 2020-03-29
                    [UesvaRegisteredTimee] => 21:10:49
                    [ivao] => XXXX
                    [vatsim] => XXXX
                    [dataAirline] => stdClass Object
                        (
                            [callsign] => AXX
                            [totalFlights] => 2
                            [totalFlightsRegular] => 2
                            [totalFlightsCharter] => 0
                            [totalFlightsEvent] => 0
                            [totalFlightsTour] => 0
                            [totalFlightsTransfer] => 0
                            [totalHoursFlights] => 1:08:57
                            [totalHoursOnline] => 2:12:44
                            [totalMilesFlown] => 440
                            [totalPassengersCarried] => 279
                            [totalPassengersFirstClass] => 0
                            [totalPassengersBusiness] => 19
                            [totalPassengersEconomic] => 260
                            [totalCargoCarried] => 98.673
                            [lastFlightDate] => 30/04/2020
                            [monthFlights] => 0
                            [monthFlightsRegular] => 0
                            [monthFlightsCharter] => 0
                            [monthFlightsEvent] => 0
                            [monthFlightsTour] => 0
                            [monthFlightsTransfer] => 0
                            [monthHoursFlights] => 00:00:00
                            [monthHoursOnline] => 00:00:00
                            [monthMilesFlown] => 0
                            [monthPassengersCarried] => 0
                            [monthPassengersFirstClass] => 0
                            [monthPassengersBusiness] => 0
                            [monthPassengersEconomic] => 0
                            [monthCargoCarried] => 0
                        )

                )

Y aca viene la pregunta del millón… ¿Es posible decirle a nuestro amigo foreach que comience a buscar desde que aparece un nombre equis?

One Answer

Gracias al usuario @Trauma (Que lastimosamente elimino el comentario) Pude solucionar mis problemas. Si usted, @Trauma, esta leyendo esto le deseo muchisima salud. Gracias a usted pude solucionar.

Paso a publicar codigo:

/*
*
*
* @params $nombre - Es una variable que almacena el nombre del usuario logueado. (string)
* 
*
*
*/
$almacen = llamadaApi(); // Una funcion que devuelve objeto.


          // Start Generator
        function generator($arr, $filtro){
            $active = False; // Empieza estableciendo $active en false.
            foreach ($arr as $key => $valor) { //Itera sobre $arr.
                                    
            if($active){ //Si active es True...
                                        
            yield $key => $valor; //Proporcioname el index y el valor actual.
                                        
            continue; // Volve a ejecutar el foreach (ignorando todo el codigo de abajo)
        }
        if ($key == $filtro) { //Si el index es igual al filtro que proporcionaste..

            $active = True; //Setea active en true
                                        
            yield $key => $valor; //Proporciona el index y el valor actual.
        }
    }
}
                                    
        $pilotos = NameFinder($almacen, $nombre);
                                    
        foreach(generator($almacen, "result") as $key => $valor){
                    //Nada, solo pasa al siguiente array
             foreach( generator( $valor, "name" ) as $key2 => $value2 ) {
                       $name1 = $value2->name;
                       
            if(substr_count($name1, $pilotos) != 0){ /*Si el valor de $name1 devuelve 
resultado distinto a 0 entonces quiere decir que la comparacion de nombres concluyo con exito*/
               echo "Valor encontrado!"
            }elseif(substr_count($name1, $pilotos) == 0){
                        continue; //Si es igual a 0 vuelve a iterar hasta que lo encuentre
                                                
                    }else{
                    echo "Ocurrio un error. Codigo de error:74201-X1";
                }
              }
        }

Answered by idunno on November 17, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP