Ordenar un arreglo (array) en php especial

  • Autor Autor Prospero
  • Fecha de inicio Fecha de inicio
Prospero

Prospero

Eta
Verificación en dos pasos activada
Hola gente, necesito Ordenar un arreglo (array) en php

Insertar CODE, HTML o PHP:
[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]<?[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]php [/FONT][/COLOR][COLOR=#87826D][FONT=Droid Sans Mono]//Lista de nombres[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$valores[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]=[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]array[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]([/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Roberto'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Antonio'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Sergio'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Oscar'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Alfredo'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Zaida'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Javier'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono],[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'Manuel'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]);[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono][/FONT][/COLOR][COLOR=#87826D][FONT=Droid Sans Mono]//Ordenamos la lista por orden alfabético[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]sort[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]([/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$valores[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]);[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono][/FONT][/COLOR][COLOR=#87826D][FONT=Droid Sans Mono]//Ejemplo: Mostramos la lista ordenada[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono][/FONT][/COLOR][COLOR=#FD971F][FONT=Droid Sans Mono]for[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono] [/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]([/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$i[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]=[/FONT][/COLOR][COLOR=#AE81FF][FONT=Droid Sans Mono]0[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono];[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$i[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]<[/FONT][/COLOR][COLOR=#AE81FF][FONT=Droid Sans Mono]8[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono];[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$i[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]++){[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]	echo $valores[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono][[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono]$i[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]].[/FONT][/COLOR][COLOR=#E6DB74][FONT=Droid Sans Mono]'<br>'[/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono];[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono][/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]}[/FONT][/COLOR][COLOR=#66D9EF][FONT=Droid Sans Mono][/FONT][/COLOR][COLOR=#D7F1FF][FONT=Droid Sans Mono]?>[/FONT][/COLOR][COLOR=#404040][FONT=Georgia]
entiendo por la ffunción sort($valores); que ordena valores descendentes, de nuestro ABECEDARIO y necesito ordenarlo con un abecedario especial como se haria?

Gracias!!
 
Pon tu código en elñ bbcode php para que se entienda :encouragement:

PHP:
<?php
//Lista de nombres
$valores = array('Roberto','Antonio','Sergio','Oscar','Alfredo','Zaida','Javier','Manuel');
//Ordenamos la lista por orden alfabético
sort($valores);
//Ejemplo: Mostramos la lista ordenada
for($i=0;$i<8;$i++){
echo $valores[$i].'<br>';
}?>
 
Si el abecedario que usas es tan especial, tendrás que crear tu propia función de ordenación. Te recomiendo algún algoritmo como el quicksort o el bubblesort, que son especialmente eficiente. En ese caso, tendrías que definir una función "mayor que" para definir el orden de las letras de tu abecedario:

Insertar CODE, HTML o PHP:
function esMayor(a,b){
  //Aquí tendras que definir que letras son mayores y cuales menores
  return a > b;
}

function quicksort( $array ) {
    if( count( $array ) < 2 ) {
        return $array;
    }
    $left = $right = array( );
    reset( $array );
    $pivot_key  = key( $array );
    $pivot  = array_shift( $array );
    foreach( $array as $k => $v ) {
        if( esMayor($v, $pivot) )
            $left[$k] = $v;
        else
            $right[$k] = $v;
    }
    return array_merge(quicksort($left), array($pivot_key => $pivot), quicksort($right));
}

$array  = quicksort( $array );
 
gracias, [MENTION=155439]ocurrencio[/MENTION]

no logro hacer andar un maldito reto. para mi faltan datos!

Consigna: Un grupo de científicos está analizando una forma de vida inteligente extraterrestre en la reconocida área 52. Han descubierto que, sorprendentemente, estos usan las mismas letras que nosotros aunque su alfabeto posee un orden distinto. Se nos encomienda la tarea de reordenar un diccionario en español para que los extraterrestres puedan buscar palabras en nuestra lengua más fácilmente. Diseñar un algoritmo que dada un string que representa todas las letras del alfabeto ordenadas según los extraterrestres y una lista de palabras, devuelva una lista de palabras ordenadas.

Insertar CODE, HTML o PHP:
<?php// Para testear tu código en nuestros servidores debes mantener la estructura expuesta abajo.
// Eres libre de crear nuevas funciones/procedimientos.
// Recuerda que el código que escribas podrá ser visto por las empresas a las que te postules.
?>
<?php
function ordenar_extraterrestre($desordenadas, $orden_alfabeto){
  // return [ ... ];
}
?>
 
Pues no entendí bien si quieres ordenar las palabras en el array o si quieres ordenar todas las palabras del array, pero suponiendo que es la primera:

PHP:
function getOrder($alphabet, $letter)
{
	$order = strpos($alphabet, $letter);

	if ($order === false) {
		return -1;
	}

	return $order;
}

function strCompare($alphabet, $str, $str2)
{
	$lenght = strlen($str);
	$lenght2 = strlen($str2);

	for ($i = 0; $i < $lenght || $i < $lenght2; $i++) { 

		if ($i >= $lenght) {
			return -1;
		} elseif ($i >= $lenght2) {
			return 1;
		}

		$strOrder = getOrder($alphabet, $str[$i]);
		$strOrder2 = getOrder($alphabet, $str2[$i]);

		if ($strOrder < $strOrder2) {
			return -1;
		} elseif ($strOrder > $strOrder2) {
			return 1;
		}
	}

	return 0;
}

La primera función lo que hace es regresar un valor para la letra dado un alfabeto, en caso de que la letra no exista regresa -1 que sería el valor más bajo.
La segunda, compara 2 cadenas. Si la cadena 1 es menor que la cadena 2 regresa -1, si la cadena 1 es mayor regresa 1, y si son iguales regresa 0.

PHP:
function ordenar_extraterrestre(array $disordered, $alphabet)
{
	$lenght = count($disordered);

	for ($i = 0; $i < $lenght; $i++) { 
		for ($j = $i + 1; $j < $lenght; $j++) { 
			if (strCompare($alphabet, $disordered[$i], $disordered[$j]) > 0) {
				$aux = $disordered[$i];
				$disordered[$i] = $disordered[$j];
				$disordered[$j] = $aux;
			}
		}
	}

	return $disordered;
}

A esta última le mandas un array de palabras (cadenas) y el alfabeto y te las regresa ordenadas según ese alfabeto. Como puedes ver usa el método de la burbuja, solo tendrías que cambiar eso si prefieres usar algún otro método.

La usarías algo como:
PHP:
$alphabet = 'dcba';

$words= array(
	'abcd',
	'dfjg',
	'abc',
	'cfgh',
);

var_dump(ordenar_extraterrestre($words, $alphabet));

y da como resultado:
PHP:
array(4) {
  [0]=>
  string(4) "dfjg"
  [1]=>
  string(4) "cfgh"
  [2]=>
  string(3) "abc"
  [3]=>
  string(4) "abcd"
}

Nota: Solo funciona para arrays numericos que empiezan en cero y que sus indices llevan un orden secuencial.

Pues no la cheque mucho, pero con ese ejemplo que usé parece si funcionar. :welcoming:
 
Última edición:
Igual la parte de la función esMayor quedaba un poco confusa:

Insertar CODE, HTML o PHP:
$alfabeto_terrestre= 'abcdefghijklmnñopqrstuvwxyz';
$alfabeto_alien= 'btueqvzarwgonclkjsxdmhñpify';
$palabras= Array('amapola','margarita','rosa','azucena','clavel','violeta');

function esMayorLetra($a,$b){
  global $alfabeto_alien;
  return strpos($alfabeto_alien, strtolower($a)) > strpos($alfabeto_alien,strtolower($b));
}
function esMayor($x,$y){
  $salida= false;
  for ($i=0; $i < min(Array(strlen($x),strlen($y))); $i++){
    if (esMayorLetra(substr($x,$i,1),substr($y,$i,1))){
      $salida= true;
      break;
    }
  }
  return $salida;
}

function quicksort($array) {
  if( count($array) < 2 ) {
    return $array;
  }
  $left = $right = Array();
  reset($array);
  $pivot_key= key($array);
  $pivot= array_shift($array);
  foreach($array as $k => $v) {
    if( esMayor($v, $pivot) ){
      $left[$k] = $v;
    } else {
      $right[$k] = $v;
    }
  }
  return array_merge(quicksort($left), array($pivot_key => $pivot), quicksort($right));
}

$array = quicksort( $palabras );
print_r($palabras);
print_r($array);

Ahora hay una funcion que compara que una letra sea mayor que otra en el alfabeto que sea y, del mismo modo, hemos creado una funcion que compara las palabras en base a la función anterior. Espero que te haya servido y que el profesor nos ponga buena nota a ambos ;-)
 
// el Metodo de la burbuja
for($i=0;$i<=$n-1;$i++){
for($k=$i+1;$k<=$n;$k++){
if($v[$k]<$v[$i]){
$aux=$v[$k];
$v[$k]=$v[$i];
$v[$i]=$aux;
}
}
}

//Nota: $v[] es el vector donde estan los datos
 
Atrás
Arriba