2010-04-24 21 views
5

He estado un poco atrapado en este por un tiempo, por lo que cualquier ayuda sería apreciada. Tengo una matriz (izquierda) que contiene una lista de elementos, el objetivo es ordenar las otras matrices (derecha) con los valores de la matriz izquierda.Cambiar el orden de índice en el conjunto

La hilera izquierda

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

La matriz de la derecha

Array 
(
    [0] => Array 
    (
     [FirstName] => Pim 
     [Address] => Finland 
     [LastName] => Svensson 
     [ID] => 3 
    ) 
    [1] => Array 
    (
     [FirstName] => Emil 
     [Address] => Sweden 
     [LastName] => Malm 
     [ID] => 5 
    ) 
) 

Lo que estoy tratando de lograr sería similar a esta

Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ) 

cualquier persona? :) ¡Oh, estoy ejecutando PHP 5.3, si ayuda!

Respuesta

7
$output = array(); 
foreach ($right as $array) { 
    foreach ($left as $field) { 
     $temp[$field] = $array[$field]; 
    } 
    $output[] = $temp; 
} 
+0

+1 por ser simple, claro, efectivo. – goat

+0

¡Maravilloso, hizo el truco! –

2

Debe explotar la matriz tienda la matriz en una variable como esto

$array = Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ); 

y luego explotar la matriz después de la explosión de la matriz obtendrá los parámetros de la matriz separados entonces se puede utilice la función de implosión, acomódelos en el orden que desee

+0

obtuviste el resultado – udaya

0

Me gustaría dar un paso atrás y ver lo que realmente necesita hacer. La matriz es asociativa, por lo que puede acceder al elemento correcto al instante, ¿verdad? Por lo tanto, no es necesario que esté en orden, a menos que imprima la salida con foreach.

me gustaría sugerir una de las siguientes soluciones:

  1. Si necesidad la matriz "derecho" a estar en clave de orden, a continuación, busque en la base de datos de consulta/similar y seleccionar las columnas de el orden que los necesita.
  2. Para la persona que desea imprimir, busque el orden en la matriz "izquierda", luego imprima el valor correspondiente de esa tecla en la matriz "derecha".
+0

No selecciono nada de un db, obtengo el arreglo de un xml que está cargado con simplexml! –

0

Bueno, su pregunta es poco común, generalmente las matrices asociativas se utilizan para resolver cualquier problema sobre "posición". De todos modos, hay muchas maneras de hacer lo que estás buscando, lo que estás buscando.

lista (Puede usar) pero es la posición en base:

foreach($oldArray as $o) 
{ 
    list($firstName,$lastName,$address,$id)=$oldArray; 
    $newArray[]=array($id,$firstName,$lastName,$address); 
} 

Pero la mejor manera de resolver su problema es llenar la matriz directamente en el orden correcto en lugar de volver a clase después :)

+0

¡Gracias! En segundo lugar, pero recibo la información en xml de otro servicio, de esta manera no siempre puedo garantizar el orden de los datos. Por lo tanto, esta extraña búsqueda! :) –

3

Puede usar uksort(), que le permite ordenar claves de matriz mediante una función definida por el usuario. Ej .:

function sort_by_array($array) { 
    // create a sorting function based on the order of the elements in the array 
    $sorter = function($a, $b) use ($array) { 
     // if key is not found in array that specifies the order, it is always smaller 
     if(!isset($array[$a])) return -1; 
     if($array[$a] > $array[$b]) { 
      return 1; 
     } 
     return ($array[$a] == $array[$b]) ? 0 : -1; 
    }; 
    return $sorter; 
} 
// $array contains the records to sort 
// $sort_array is the array that specifies the order 
foreach($array as &$record) { 
    uksort($record, sort_by_array(array_flip($sort_array))); 
} 

Hago uso de la posibilidad en 5.3 Para definir las funciones de forma dinámica y utilizo array_flip() para transformar:

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

a

Array 
(
    [ID] => 0 
    [FirstName] => 1 
    [LastName] => 2 
    [Address] => 3 
) 

Esto hace que sea más fácil comparar las claves más tarde.

+2

1+ por ser flexible, pero creo que es demasiado complejo para este caso en particular. – goat

+0

@chris: Sí, en este caso, dependiendo de lo que el OP realmente quiera hacer con la matriz, podría ser complejo. Pero me pregunté por qué nadie mencionó este método y quería mostrar que es posible. –

Cuestiones relacionadas