Quiero obtener los identificadores de los elementos secundarios en una matriz. De mi tabla, id 5 es el padre de id (4, 11) e id 4 es el padre de id 9. si llamo a la función childCategoryIds() con id 5, debería devolver [11, 9, 4], pero está regresando [11, 4]. Mi función y los datos SQL se ven así:

Mesa:

id  parent_id   name        
4   5           Cat Four    
5   1           Cat Five    
9   4           Cat Nine
11  5           Cat Eleven  

Mi función:

function childCategoryIds($id){
    $ci = & get_instance();
    $ci->load->database();

    $child_category_ids = array();

    $ci->db->where('parent_id', $id)->order_by('id', 'DESC');
    $query = $ci->db->get('categories');
    $result = $query->result();
    foreach ($result as $res):
        childCategoryIds($res->id);
        $child_category_ids[] = $res->id;
     // var_dump($res->id);
    endforeach;

    return $child_category_ids;
}

He llamado a esta función desde mi controlador.

childCategoryIds(5);    /* here id = 5 */

De la función $ child_category_ids return id (11, 4). pero var_dump ($ res-> id) muestra todos los identificadores (11, 9, 4) en el bucle. Según tengo entendido, el bucle se ejecuta solo una vez en la función o cuando la función se llama a sí misma en el bucle, no puede enviar su identificación a $ child_category_ids .

Obtuve el siguiente resultado de esta función.

array(2) {
    [0] => string(2) "11" 
    [1] => string(1) "4"
}

Pero mi resultado esperado es:

array(2) {
    [0] => string(2) "11" 
    [1] => string(1) "9"
    [2] => string(1) "4"
}

Tengo algunas preguntas similares, pero no pude encontrar la solución.

0
Mustafa 28 oct. 2019 a las 16:30

1 respuesta

La mejor respuesta

El problema es el alcance, las variables declaradas en su función no se ven fuera de él (incluso cuando se llaman de forma recursiva). si descarga childCategoryIds($res->id); probablemente verá la información si se recupera, pero no se almacena en la matriz.

Podría probar algo como array_merge para extraer los datos en la misma matriz, o simplemente recorrer los resultados y agregarlos como se muestra a continuación:

$result = $query->result();
foreach ($result as $res):

    $children = childCategoryIds($res->id);
    $child_category_ids = array_merge($child_category_ids, $children);

    $child_category_ids[] = $res->id;
    // var_dump($res->id);
endforeach;

O

$result = $query->result();
foreach ($result as $res):

    $children = childCategoryIds($res->id);
    foreach ($children as $child) {
        $child_category_ids [] = $child;
    }

    $child_category_ids[] = $res->id;
    // var_dump($res->id);
endforeach;
1
Jon Allen 28 oct. 2019 a las 13:52