2011-12-22 12 views
5

que tienen una matriz:Intercambia dos pares clave/valor en una matriz

$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4'); 

¿Cómo se intercambie dos teclas ronda por lo que la matriz está en un orden diferente? P.ej. para producir esta matriz:

$array = array('d' => 'val4', 'b' => 'val2', 'c' => 'val3', 'a' => 'val1'); 

Gracias :).

+0

En el código de ejemplo está utilizando una matriz asociativa. El orden Key => value no debería importar en una matriz asociativa ya que la razón de una matriz asociativa es acceder a los valores por su clave y no su posición en la matriz. –

+0

@DavidMyers: si haces 'foreach ($ array as $ key => $ value)', la orden puede ser importante. Por ejemplo: una lista o tabla HTML. –

+2

@Rocket Estoy de acuerdo en que podría hacerlo, pero sugeriría que hay formas mucho mejores de organizar los datos. Si proviene de SQL, entonces use ORDER BY. Puede agregar información programáticamente en la matriz según el orden mucho más fácil de lo que puede volver a organizar si después. Eso supone que la matriz no está codificada, en cuyo caso debe escribirla en el orden que desee. –

Respuesta

3

pensé que no habría respuesta muy simple por ahora, así que voy a tirar mina en la pila:

// Make sure the array pointer is at the beginning (just in case) 
reset($array); 

// Move the first element to the end, preserving the key 
$array[key($array)] = array_shift($array); 

// Go to the end 
end($array); 

// Go back one and get the key/value 
$v = prev($array); 
$k = key($array); 

// Move the key/value to the first position (overwrites the existing index) 
$array = array($k => $v) + $array; 

Esto está intercambiando los elementos primero y último de la matriz, conservando las claves. Pensé que querías array_flip() originalmente, así que espero haber entendido bien.

Demostración: http://codepad.org/eTok9WA6

+2

Mi intuición es que no * realmente * necesita hacer esto, y hay otro problema que quiere resolver, pero ha escogido esto como la solución. Quizás estoy equivocado, pero lo veo bastante aquí. –

+1

Esa es una solución ordenada. Sin embargo, es posible que desee intercambiar dos claves arbitrarias, no solo la primera y la última. +1 de todos modos porque esta es una solución genial. –

+0

Es posible que desee esto si esta matriz se utiliza para una tabla HTML y el orden es importante. –

0

¿No puedes simplemente almacenar el valor en una variable para cada uno?

$val1 = $array[0]; 
$val2 = $array[3]; 
$array[0] = $val2; 
$array[3] = $val1; 
+1

Parece querer cambiar la orden, no los valores. –

1

No es ideal, pero hace lo que quiere hacer:

$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4'); 

$keys = array_keys($array); 
swap($keys, 0, 3); 
$values = array_values($array); 
swap($values, 0, 3); 
print_r(array_combine($keys, $values)); // Array ([d] => val4 [b] => val2 [c] => val3 [a] => val1) 

function swap (&$arr, $e1, $e2) 
{ 
    $temp = $arr[$e1]; 
    $arr[$e1] = $arr[$e2]; 
    $arr[$e2] = $temp; 
} 

Por supuesto, también debe comprobar si los dos índices se establecen en swap función (usando isset)

+0

Puede usar 'array_search ('a', $ keys)' en lugar de usar teclas numéricas. –

2

Mejor Un forma es hacer matrices de las claves y los valores. Cambia las posiciones en ambas matrices y luego vuelve a juntarlas.

function swapPos(&$arr, $pos1, $pos2){ 
    $keys = array_keys($arr); 
    $vals = array_values($arr); 
    $key1 = array_search($pos1, $keys); 
    $key2 = array_search($pos2, $keys); 

    $tmp = $keys[$key1]; 
    $keys[$key1] = $keys[$key2]; 
    $keys[$key2] = $tmp; 

    $tmp = $vals[$key1]; 
    $vals[$key1] = $vals[$key2]; 
    $vals[$key2] = $tmp; 

    $arr = array_combine($keys, $vals); 
} 

Demostración: http://ideone.com/7gWKO

0

Puede utilizar esta función para cambiar cualquier valor en orden a cualquier tecla.

/** 
* switch value with value on key in given array 
* array_switch(array(a, b ,c), c,0); 
* will return array(c, b, a); 
* 
* 
* @param array $array    
* @param mixed $value    
* @param mixed $key    
* @return array 
*/ 
public static function array_switch(&$array, $value, $key) 
{ 
    // find the key of current value 
    $old_key = array_search($value, $array); 
    // store value on current key in tmep 
    $tmp = $array[$key]; 
    // set values 
    $array[$key] = $value; 
    $array[$old_key] = $tmp;  
    return $array; 
} 
Cuestiones relacionadas