Crear matriz anidada para datos

Sep 26 2020

Estoy ejecutando una consulta SQL para obtener los datos y luego los agrego a una matriz. Estoy tratando de lograr los datos en una matriz anidada. Como la tabla de la escuela está devolviendo varios datos para la tabla de usuarios.

Aquí está el código.

$res=array(); $data = $mysqli->prepare("SELECT name, rollno, pic from `users` as a and a.uid = ?"); $data ->bind_param("i", $uid); $data->execute();
$data->store_result(); $data->bind_result($name, $rollno, $pic); if($data->num_rows != 0){
    while ($data->fetch()){ $name = $name; $rollno = $rollno; $pic = $pic; $res['content'][] = array(
                    "name" => $name, "rollno" => $rollno,
                    "pic" => $pic ); $sdata = $mysqli->prepare("SELECT a.uid, a.class, a.subject, a.board from `school` as a and a.uid = ?"); $sdata ->bind_param("i", $uid); $sdata->execute();
$sdata->store_result(); $sdata->bind_result( $uid, $class, $subject, $board);
                        
        if($sdata->num_rows != 0){ while ($sdata->fetch()){
                    $uid = $uid;
                    $class = $class;
                    $subject = $subject;
                    $board = $board;    
                    
                $res['content']['pricing'][] = array( "uid" => $uid,
                            "class" => $class, "subject" => $subject,
                            "board" => $board
                );      
            }
            }
        }
    }

El método anterior me está dando un resultado como este.

Array
(
    [content] => Array
        (
            [0] => Array
                (
                    [name] => Test User1
                    [rollno] => 9
                    [pic] => 9_1599452969.jpg
                   
                )

            [1] => Array
                (
                    [name] => Test User2
                    [rollno] => 8
                    [pic] => 8_1599452969.jpg
                    
                )

            [pricing] => Array
                (
                    [0] => Array
                        (
                            [uid] => 8
                            [class] => 2
                            [subject] => Math
                            [board] => CBSE
                        )

                    [1] => Array
                        (
                            [uid] => 8
                            [class] => 2
                            [subject] => Science
                            [board] => CBSE
                        )

                    [2] => Array
                        (
                            [uid] => 9
                            [class] => 2
                            [subject] => Science
                            [board] => CBSE
                        )

                    [3] => Array
                        (
                            [uid] =>9
                            [class] => 2
                            [subject] => English
                            [board] => CBSE
                        )

                    [4] => Array
                        (
                            [uid] => 9
                            [class] => 2
                            [subject] => Math
                            [board] => CBSE
                        )

                )

        )

)

Como puede ver, los datos de la matriz de precios vienen después de los datos de contenido. Quiero que esté en la misma línea de forma anidada.

  Array
(
    [content] => Array
        (
            [0] => Array
                (
                    [name] => Test User1
                    [rollno] => 9
                    [pic] => 9_1599452969.jpg
                    [Pricing][0] => Array
                        (
                            [uid] => 9
                            [class] => 2
                            [subject] => Science
                            [board] => CBSE
                        )

                    [1] => Array
                        (
                            [uid] =>9
                            [class] => 2
                            [subject] => English
                            [board] => CBSE
                        )

                    [2] => Array
                        (
                            [uid] => 9
                            [class] => 2
                            [subject] => Math
                            [board] => CBSE
                        ) 
                   
                )

            [1] => Array
                (
                    [name] => Test User2
                    [rollno] => 8
                    [pic] => 8_1599452969.jpg
                    [pricing][0] => Array
                        (
                            [uid] => 8
                            [class] => 2
                            [subject] => Math
                            [board] => CBSE
                        )

                    [1] => Array
                        (
                            [uid] => 8
                            [class] => 2
                            [subject] => Science
                            [board] => CBSE
                        )
                )

            [pricing] => Array
                (
                    

                    

                )

        )

)

Respuestas

1 MarcinOrlowski Sep 26 2020 at 11:10

El enfoque más simple sería crear una matriz temporal, alimentarla con todos los datos y luego agregarla $res. Entonces en lugar de

        $res['content'][] = array(
                    "name" => $name, "rollno" => $rollno,
                    "pic" => $pic
        );      

hacer

        $tmp = array(
                    "name" => $name, "rollno" => $rollno,
                    "pic" => $pic
        );      

Luego, agregue precios, en lugar de

                $res['content']['pricing'][] = array(
                            "uid" => $uid, "class" => $class,
                            "subject" => $subject, "board" => $board
                );      

agregar a la matriz temporal

                $tmp['pricing'][] = array( "uid" => $uid,
                            "class" => $class, "subject" => $subject,
                            "board" => $board
                );     

Y finalmente, antes de hacer otra iteración del bucle principal, agréguelo a $res

$res['content'][] = $tmp;