Bueno
videlxu como te comentaba, realice esta funcion con un proposito diferente, el cual es categorizar un array y poder exponerlo en modo arbol, y por lo que mencionas de
sistema de comentarios padre hijo crei que podria servirte.
La funcion solo requiere que le pases el arreglo bidimensional el cual deve tener 2 campos especificos, el que lo identifica y el que identifica a su padre, algo asi como:
Código PHP:
<?php
$arreglo = array(
0 => array(
'id' => 1, // campo identificador
'padre' => 0, // campo identificador del padre
'autor' => 'Josefino',
'mensaje' => 'Mensaje...',
'fecha' => 1548964523 // valor unix (yo asi manejo las fechas, no se como lo haras tu)
),
1 => array(
'id' => 2,
'padre' => 0,
'autor' => 'Gracielo',
'mensaje' => 'Mensaje...',
'fecha' => 1548984523
),
2 => array(
'id' => 3,
'padre' => 0,
'autor' => 'Rogelia',
'mensaje' => 'Mensaje...',
'fecha' => 1548988523
),
3 => array( // respuesta a mensaje 'id' => 2
'id' => 4,
'padre' => 2,
'autor' => 'Cacheton',
'mensaje' => 'Respuesta...',
'fecha' => 1548988623
),
4 => array(
'id' => 5,
'padre' => 0,
'autor' => 'Caliman',
'mensaje' => 'mensaje...',
'fecha' => 1548988723
),
5 => array( // respuesta a respuesta 'id' => 3
'id' => 6,
'padre' => 4,
'autor' => 'Caliman',
'mensaje' => 'Respuesta...',
'fecha' => 1548988823
)
);
?>
Al pasar el arreglo por la funcion, lo modifica ordenadolo para mostrarlo en modo arbol, y segun el campo especificado para ordenar, ademas los indices son reemplazados por el identificador de fila:
Código PHP:
<?php
categorize(
$arreglo,
'fecha', // campo a ordenar
SORT_ASC, // el modo a ordenar
'id', // nombre del campo identificador de fila
'padre' // nombre del campo identificador de fila padre
);
?>
El nuevo arreglo quedaria asi:
Código HTML:
Array
(
[1] => Array
(
[id] => 1
[padre] => 0
[autor] => Josefino
[mensaje] => Mensaje...
[fecha] => 1548964523
[__HIJOS__] => 0
[__NIVEL__] => 0
[__LUGAR__] => 1
)
[2] => Array
(
[id] => 2
[padre] => 0
[autor] => Gracielo
[mensaje] => Mensaje...
[fecha] => 1548984523
[__HIJOS__] => 1
[__NIVEL__] => 0
[__LUGAR__] => 2
)
[4] => Array
(
[id] => 4
[padre] => 2
[autor] => Cacheton
[mensaje] => Respuesta...
[fecha] => 1548988623
[__HIJOS__] => 1
[__NIVEL__] => 1
[__LUGAR__] => 0
)
[6] => Array
(
[id] => 6
[padre] => 4
[autor] => Caliman
[mensaje] => Respuesta...
[fecha] => 1548988823
[__HIJOS__] => 0
[__NIVEL__] => 2
[__LUGAR__] => 0
)
[3] => Array
(
[id] => 3
[padre] => 0
[autor] => Rogelia
[mensaje] => Mensaje...
[fecha] => 1548988523
[__HIJOS__] => 0
[__NIVEL__] => 0
[__LUGAR__] => 2
)
[5] => Array
(
[id] => 5
[padre] => 0
[autor] => Caliman
[mensaje] => mensaje...
[fecha] => 1548988723
[__HIJOS__] => 0
[__NIVEL__] => 0
[__LUGAR__] => 3
)
)
Ahora, para
paginar un hijo como lo mencionas, tengo otra funcion la cual retorna un array con la descendencia de una fila, esta se deve llamar despues de categorize():
Código PHP:
<?php
/**
* El parametro $id_fila de la cual se obtendra la descendencia
* El parametro $todos para obtener no solo los hijos, tambien nietos, bistnietos, etc.
*/
function categorize_getChildren($arreglo, $id_fila, $todos = false, $campo_id = 'id', $campo_padre = 'padre'){
$colector = array();
// verificar que el arreglo sea valido y que la $id_fila y campos id y padre existan
if(!is_array($arreglo) ||
1 > count($arreglo) ||
!array_key_exists($id_fila, $arreglo) ||
!is_array($arreglo[$id_fila]) ||
!array_key_exists($campo_id, $arreglo[$id_fila]) ||
!array_key_exists($campo_padre, $arreglo[$id_fila])
){
return $colector;
}
// la funcion-variable que hace el trabajo
$buscar_hijos = function(&$colector, $arreglo, $id_fila, $campo_id, $campo_padre, $buscar_hijos, $todos = false){
foreach($arreglo as $indice => $fila){
if($fila[$campo_padre] == $id_fila){
$colector[$fila[$campo_id]] = $fila;
unset($arreglo[$indice]);
if($todos){
$buscar_hijos($colector, $arreglo, $fila[$campo_id], $campo_id, $campo_padre, $buscar_hijos, true);
}
}
}
unset($indice, $fila);
};
$buscar_hijos($colector, $arreglo, $id_fila, $campo_id, $campo_padre, $buscar_hijos, $todos);
return $colector;
}
?>
Modo de uso:
Código PHP:
<?php
$hijos = categorize_getChildren(
$arreglo,
2, // id de fila de la cual se obtendra la descendencia
true, // para obtener hijos, nietos, etc.
'id', // nombre del campo identificador de fila
'padre' // nombre del campo identificador de fila padre
);
?>
El resultado seria:
Código HTML:
Array
(
[4] => Array
(
[id] => 4
[padre] => 2
[autor] => Cacheton
[mensaje] => Respuesta...
[fecha] => 1548988623
[__HIJOS__] => 1
[__NIVEL__] => 1
[__LUGAR__] => 0
)
[6] => Array
(
[id] => 6
[padre] => 4
[autor] => Caliman
[mensaje] => Respuesta...
[fecha] => 1548988823
[__HIJOS__] => 0
[__NIVEL__] => 2
[__LUGAR__] => 0
)
)
Bueno espero esto te funcione.
Saludos!