No sabe con certeza si esto fue mencionado, pero, la razón de que esto es difícil es porque no está indexado toma
Repasemos:
$arrOrig = array(
'fruit'=>'pear',
'veg'=>'cucumber',
'tuber'=>'potato'
);
obtener las claves:
$arrKeys = array_keys($arrOrig);
print_r($arrKeys);
Array(
[0]=>fruit
[1]=>veg
[2]=>tuber
)
obtener los valores:
$arrVals = array_values($arrOrig);
print_r($arrVals);
Array(
[0]=>pear
[1]=>cucumber
[2]=>potato
)
Ahora tienes 2 arrays de tipo numérico. Cambie los índices de los que desea intercambiar y luego vuelva a leer la otra matriz en el orden de la matriz numérica modificada. Digamos que queremos intercambiar 'fruta' y 'verduras':
$arrKeysFlipped = array_flip($arrKeys);
print_r($arrKeysFlipped);
Array (
[fruit]=>0
[veg]=>1
[tuber]=>2
)
$indexFruit = $arrKeysFlipped['fruit'];
$indexVeg = $arrKeysFlipped['veg'];
$arrKeysFlipped['veg'] = $indexFruit;
$arrKeysFlipped['fruit'] = $indexVeg;
print_r($arrKeysFlipped);
Array (
[fruit]=>1
[veg]=>0
[tuber]=>2
)
Ahora, puede intercambiar hacia atrás la matriz:
$arrKeys = array_flip($arrKeysFlipped);
print_r($arrKeys);
Array (
[0]=>veg
[1]=>fruit
[2]=>tuber
)
Ahora, se puede construir una matriz pasando a través de la matriz oringal en el 'orden' de las teclas reorganizadas.
$arrNew = array();
foreach($arrKeys as $index=>$key) {
$arrNew[$key] = $arrOrig[$key];
}
print_r($arrNew);
Array (
[veg]=>cucumber
[fruit]=>pear
[tuber]=>potato
)
No he probado esto, pero esto es lo que esperaría. ¿Esto al menos proporciona algún tipo de ayuda? Buena suerte :)
Usted podría poner esto en una función $arrNew = array_swap_assoc($key1,$key2,$arrOld);
<?php
if(!function_exists('array_swap_assoc')) {
function array_swap_assoc($key1='',$key2='',$arrOld=array()) {
$arrNew = array();
if(is_array($arrOld) && count($arrOld) > 0) {
$arrKeys = array_keys($arrOld);
$arrFlip = array_flip($arrKeys);
$indexA = $arrFlip[$key1];
$indexB = $arrFlip[$key2];
$arrFlip[$key1]=$indexB;
$arrFlip[$key2]=$indexA;
$arrKeys = array_flip($arrFlip);
foreach($arrKeys as $index=>$key) {
$arrNew[$key] = $arrOld[$key];
}
} else {
$arrNew = $arrOld;
}
return $arrNew;
}
}
?>
ADVERTENCIA: Por favor, probar y depurar antes de usarlo solo - no se han realizado pruebas en absoluto.
Es para el uso con Drupal API forma, el orden de la matriz determina el orden se imprime cada elemento (campo). Sin embargo, también puedo usar la propiedad '#weight' para alterar el orden que parece ser más fácil. Simplemente significa iterar sobre cada campo para establecer un nuevo peso. –
Estoy de acuerdo con Lex. PHP no proporciona una función nativa para intercambiar elementos de la matriz. Probablemente puedas escribir el tuyo con una combinación del resto de las funciones de la matriz y mucha paciencia, pero, honestamente, reescribir la matriz completa con un ciclo foreach es, de lejos, el método más fácil. Una función de intercambio personalizada no vale la pena el esfuerzo a menos que maneje arreglos muy grandes y, en tal caso, probablemente debería rediseñar esa parte de la lógica del código. –
¿Se supone que esto es una respuesta? Bueno, tengo el mismo problema. Necesito cambiar el orden de dos elementos en una matriz – Mike