2011-02-04 19 views
12

Mi matriz:php fin matriz asociativa llave (no ordenar)

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

Ahora, con cuando iterar la matriz, el primer valor que se van a plantear, probablemente será

$data['two'] // = 2 @ index[0] 

¿verdad?

¿Qué sucede si quiero mover $ data [1] a la posición de $ data [0]?

reformular:

Como hago para quitar la matriz este aspecto (de modo que 'uno' se acerca a $ datos [0])

$data = array('one' => 1, 'two' => 2, 'three' => 3 

¿Por qué necesito esto?

Uso el código encendedor, la función generar tabla incorporada toma una matriz asociada y crea una tabla, pero no ofrece ningún método para organizar las columnas. Es por eso que me gustaría mover las columnas en la matriz fuente.

+0

Posible duplicado de [? Ordena una matriz por claves sobre la base de otra Array] (http : //stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array) – iautomation

+0

@iautomation La pregunta no mencionaba el uso de un segundo conjunto para controlar el orden del primero.Pidieron una solución para controlar el orden de las claves después de que se haya creado la matriz. Usar otra matriz PUEDE ser una posible solución, pero no debe ser un factor limitante para encontrar soluciones para esta pregunta. – RedYetiCo

Respuesta

6

Eche un vistazo a daniele centamore's comment en la función array_splice() de PHP, donde proporciona un par de funciones para mover los elementos en una matriz asociativa.

+0

Escribió algo basado en él, gracias – nizzle

+4

Eso realmente no responde la pregunta. El ejemplo de Daniele no es para matrices asociativas – Ben

+1

ksort ($ data); trabaja conmigo –

1

PHP tiene 13 functions for sorting arrays, por clave, por valor, por funciones definidas por el usuario donde puede especificar que "uno" viene antes de "dos". También hay array_shift, array_unshift, array_push y array_pop para mover cosas hacia o desde el frente o el final de la matriz. Puede construir una matriz completamente nueva a partir de la existente.

+0

Sé que estas funciones son geniales. Sin embargo, observe cómo dice 'No ordenar' en el título. Además, no pude encontrar la función array_move_index ('one', 0); – nizzle

+6

Reordenar un conjunto de elementos * es * clasificación. El hecho de que su orden no sea lexicográfica o numérica no significa que ordenar arreglos en ese orden no esté ordenando. Ese es el verdadero significado de la palabra. –

+0

Exactamente, debe usar la orden y escribir un cierre simple. – loostro

-1

creo, se debe utilizar asort función:

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

$dataOrdered = $data; 
asort($dataOrdered); 

Run this code

+1

Esto no ordena por clave, ¡clasifica por valor! Consulte aquí: http://codepad.org/wUAsV5hr – oriadam

+0

La pregunta solicitó específicamente una solución sin ordenar. – RedYetiCo

10

dos posibles soluciones (sin utilizar array_splice):

1) Crear una nueva matriz con el nuevo orden de la llaves.

$new_keys = array('one', 'two', 'three'); 
$new_data = array(); 
foreach ($new_keys as $key) { 
    $new_data[$key] = $data[$key]; 
} 
$data = $new_data; 

2) mover el elemento de one adelantado, eliminarlo de $data y copiar el resto de la matriz.

function rearrangeData($data) { 
    $result['one'] = $data['one']; 
    unset($data['one']); 
    return array_merge($result, $data); 
}  
$data = rearrangeData($data); 
1

Ver ksort y uksort.

Aquí está un ejemplo de trabajo:

<?php 

$data = array('two' => 2, 'one' => 1, 'three' => 3); 
print_r($data); 
ksort($data); 
print_r($data); 
uksort($data,'cmp'); 
print_r($data); 
function cmp($a, $b) 
{ 
    $num=' one two three four five six seven eight nine ten'; 
    $ai = stripos($num,$a); 
    $bi = stripos($num,$b); 
    if ($ai>0 && $bi>0) { 
     return ($ai > $bi) ? 1 : -1; 
    } 
    return strcasecmp($a, $b); 
} 

Salida:

Array 
(
    [two] => 2 
    [one] => 1 
    [three] => 3 
) 
Array 
(
    [one] => 1 
    [three] => 3 
    [two] => 2 
) 
Array 
(
    [one] => 1 
    [two] => 2 
    [three] => 3 
) 

Ejecutar este: http://codepad.org/yAK1b1IP

Cuestiones relacionadas