Ordenar registros con php

Hola amigos he estado realizando un panel de administración para un sitio web en la cual tenía que ordenar los artículos por un campo llamado orden en la tabla, con un poco de tiempo y ganas logre hacer una función que me soluciona ese problema, les explico como funciona.

Digamos que tenemos una tabla llamada artículos y tiene como campos id, orden, titulo, y yo quisiera tener la forma de ordenar los registros a través de una interfaz, algo así como usa Joomla para ordenar sus artículos o categorías. Pues bien para ello primero hago mi consulta a mi tabla y obtengo una arreglo:

array(id=>orden)

Es un arreglo, como índice le paso el id del artículo y el valor es el orden.
Aquí les dejo el código:

$a = array("1"=>"1","2"=>"2","3"=>"3","4"=>"4","5"=>"5");
$b = array("4"=>"2");
print_r(ordenar($a,$b));
//Array ( [4] => 2 [2] => 3 [3] => 4 )
function ordenar($a=array(),$b=array()){
	$c = array();
	//1.QUE ESTEN ORDENADO POR VALOR DE MENOR A MAYOR
	asort($a);
	asort($b);
	//2.QUE EXISTA EL INDICE A CAMBIAR
	if (array_key_exists(key($b), $a)) {
		$k = key($b);
		$v = current($b);
		if($a[$k] != $v){//3. COMPROBAR SI NO EXISTE VALOR EN ARRAY ORIGINAL
			//4. REVERTIR EL ORDEN
			$a2 = array_reverse($a, true);
			//5. SI EL VALUE A CAMBIAR ES MENOR
			if($v < $a[$k]){
				foreach($a2 as $k3=>$v3){
					if($v3 == $a[$k]){
						$c[$k3] = $v;
					}elseif($v3 >= $v and $v3 < $a[$k] ){
						$c[$k3] = $v3 + 1;
					}
				}
			}
			//6. SI EL VALUE A CAMBIAR ES MAYOR
			if($v > $a[$k]){
				foreach($a2 as $k3=>$v3){
					if($v3 == $a[$k]){
						$c[$k3] = $v;
					}elseif($v3 > $a[$k] and $v3 <= $v ){
						$c[$k3] = $v3 - 1;
					}
				}
			}
 
		}
	}else{// SI NO EXISTE EL INDICE A CAMBIAR
		$k = key($b);
		$v = current($b);
		$a2 = $a;
		if(array_search($v,$a)){
			$i = 0;
			$e = 0;
			foreach($a2 as $k3=>$v3){
				if($e == 0 && $v3 == $v){
					$c[$k3] = $v + 1 ;
					$e = 1;
					$i++;
				}elseif($e == 1 && $v3 == $v + $i){
					$c[$k3] = $v + $i + 1 ;
					$i++;
				}
			}
			$c[$k] = $v;
		}else{
			$c[$k] = $v;
		}
	}
	asort($c);
	return $c;
}

$a es el arreglo de mi tabla id y orden
$b es el arreglo que indica que deseo cambiar (quiero que el id=4 sea de orden 2)
el resultado es un arreglo con los cambios mínimos que se debe hacer para que se ordene como he requerido, entonces deberia actualizar mi tabla con este último arreglo.

Array ( [4] => 2 [2] => 3 [3] => 4 )

Espero que se haya entendido, cualquier duda no dude en comentar, hasta la próxima.

(Visited 599 times, 1 visits today)
Puedes saltar al final y dejar una respuesta. Hacer ping no está permitido actualmente.