Last active
December 21, 2018 07:53
-
-
Save GATEJECA/d08b57e8b0e4aa9c214ce11916995427 to your computer and use it in GitHub Desktop.
Platzi Reto 5 - Diciembre 20 (2018) Separación y ordenamiento Casas Grinch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Reto 5 - Diciembre 20 (2018) | |
https://platzi.com/blog/grinch/ | |
Nombre: Carlos E. Garcia | |
@GATEJECA | |
Notas: | |
1- La separación del archivo CSV es por , y por salto de linea | |
2- el archivo CSV original tiene un header inicial (ID,Number) | |
3- los regalos de las casas son enteros (uso int_val) | |
4- se usó quickSort para ordenar | |
*/ | |
// Obtengo la información de la fuente y posteriormente se valida | |
$csv = @file_get_contents("http://i.platzi.com/casa.csv"); | |
if ($csv !== false) { | |
// Obtengo el contenido de la información (su separación es por , y espacio) | |
$csvSeparadoArreglos = explode("\n", $csv); | |
// Obtengo el encabezado para que no interfiera con el ordenamiento | |
$encabezado = array_shift($csvSeparadoArreglos); | |
// Encabezados para la descarga del nuevo archivo CSV | |
header('Content-Description: File Transfer'); | |
header('Content-Encoding: UTF-8'); | |
header('Content-type: text/csv; charset=UTF-8'); | |
header('Content-Disposition: inline; filename=CasasGrinchPlatzi.csv'); | |
header('Expires: 0'); | |
header('Pragma: no-cache'); | |
// Pasos de derecha a izquierda | |
// 1- Otengo el resultado de la funcion quicksort | |
// 2- vuelvo a unir en un string | |
// 3- al incio concateno el encabezado original | |
// 4- se descarga el archivo | |
echo $encabezado . "\n" . implode("\n", quickSort($csvSeparadoArreglos)); | |
exit; | |
} else { | |
echo "Ocurrió un error al obtener la información"; | |
} | |
function quickSort($lista) | |
{ | |
// Caso base, si la longitud del arreglo es 0 lo retorno | |
if (count($lista) <= 1) { | |
return $lista; | |
} else { | |
/* | |
se selecciona el punto de partida tomando como base la primera posición del arreglo | |
tomando como partida que nuestro elemento es un string y necesita obtener las casas | |
que se encuentra en la posición 2 (una vez separado por coma) ejemplo: Casa 1,75741 | |
*/ | |
$elementoInicial = intval(explode(",", $lista[0])[1]); | |
// se declaran dos arreglos para hacer una particion si es menor o si es mayor | |
$izquierdo = $derecho = []; | |
/* | |
se hace un ciclo for desde el segundo elemento (el primero es el elemento inicial) y se | |
va comparando cada elemento (haciendo su correspondiente explode para obtener la parte entera) | |
y dependiendo del resultado se va al arreglo izquierdo (la cantidad es menor) o al derecho | |
(la canrtidad es mayor) | |
*/ | |
for ($i = 1; $i < count($lista); $i++) { | |
if (intval(explode(",", $lista[$i])[1]) < $elementoInicial) { | |
$izquierdo[] = $lista[$i]; | |
} else { | |
$derecho[] = $lista[$i]; | |
} | |
} | |
/* | |
por ultimo se hace recursión para los arreglos izquierdo y derecho | |
hasta que ya no haya comparación y al final se une en un solo arreglo, tomando en cuenta que el ordenamiento es con base en las casas de mayor a menor cantidad de regalos | |
*/ | |
return array_merge(quickSort($derecho), array($lista[0]), quickSort($izquierdo)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment