Bueno, yo tube un problema similar, ocupaba categorizar un array y cree una funcion para esto, imagino que puede servirte, solo se requieren de dos campos para que funcione, el identificador y el padre:
Código PHP:
<?php
/*
* Estructura requerida del arreglo:
* $arreglo = array(
* array(
* 'campo_id'=>INT,
* 'campo_padre'=>INT[,
* ...]
* ),
* ...]
* )
*
* El arreglo sera modificado teniendo el 'campo_id' asociado a las filas
*
* El parametro "$campo_ordenar" me imagino pondras el que contiene la fecha de publicacion
* Los parametros "$campo_id" y "$campo_padre" los nombres de los campos, repectivamente, dentro de las filas
*/
function categorize(&$arreglo, $campo_ordenar = false, $modo_orden = SORT_ASC, $campo_id = 'id', $campo_padre = 'padre'){
// verificar que el arreglo sea valido y los campos id y padre existan
if(!is_array($arreglo) || 1 > count($arreglo)){
return;
}
$u = $arreglo;
$u = array_pop($u);
if(!is_array($u) || !array_key_exists($campo_id, $u) || !array_key_exists($campo_padre, $u)){
return;
}
// ordenar el arreglo segun el campo especificado
if($campo_ordenar && array_key_exists($campo_ordenar, $u)){
$lista = array();
foreach($arreglo as $indice => $fila){
$lista[$indice] = $fila[$campo_ordenar];
}
unset($indice, $fila);
array_multisort($lista, $modo_orden, $arreglo);
unset($lista);
}
unset($u);
// se crea el colector asignando el indice 0 como el padre principal donde arranca la busqueda de hijos
$colector = array(array());
$colector[0]['_NIVEL_'] = -1;
$colector[0]['_HIJOS_'] = 0;
$colector[0][$campo_padre] = -1;
// la funcion-variable que hace el trabajo
$busca_hijos = function(&$colector, $arreglo, $id_padre, $campo_id, $campo_padre, $busca_hijos){
$x = 0;
foreach($arreglo as $indice => $fila){
if($fila[$campo_padre] == $id_padre){
$colector[$id_padre]['_HIJOS_'] ++;
$fila['_HIJOS_'] = 0;
$fila['_NIVEL_'] = $colector[$id_padre]['_NIVEL_'] + 1;
$fila['_LUGAR_'] = $x > 0 ? 2 : 1;
$colector[$fila[$campo_id]] = $fila;
unset($arreglo[$indice]);
$busca_hijos($colector, $arreglo, $fila[$campo_id], $campo_id, $campo_padre, $busca_hijos);
$final = $fila[$campo_id];
$x ++;
}
}
unset($indice, $fila);
if($x > 1){
$colector[$final]['_LUGAR_'] = 3;
}
else if($x > 0){
$colector[$final]['_LUGAR_'] = 0;
}
};
$busca_hijos($colector, $arreglo, 0, $campo_id, $campo_padre, $busca_hijos);
unset($colector[0]);
// si "$colector" y "$arreglo" son diferentes es porque alguna fila quedo sin padre en algun mal manejo de datos al actualizar la tabla
// estos "huerfanos" se agregan al final del nuevo "$arreglo"
if(count($arreglo) != count($colector)){
foreach($arreglo as $fila){
if(!array_key_exists($fila[$campo_id], $colector)){
$fila['_HIJOS_'] = 0;
$fila['_NIVEL_'] = 0;
$fila['_LUGAR_'] = 0;
$colector[$fila[$campo_id]] = $fila;
}
}
unset($fila);
}
$arreglo = $colector;
}
?>
Modo de uso:
Código PHP:
<?php
$consulta = mysql_query("SELECT * FROM tabla", $conexion);
$lista = array();
while($fila = mysql_fetch_assoc($consulta)){
$lista[] = $fila;
}
mysql_free_result($consulta);
unset($consulta, $fila);
categorize($lista);
foreach($lista as $id => $datos){
echo str_repeat(' ', $datos['_NIVEL_']) . $datos['mensaje'] .'<br />';
}
?>
Bueno espero te sirva, si lo usas nos cuentas que tal te fue.
Saludos!