¿Hay alguna manera de cambiar todas las teclas numéricas a “Nombre” sin recorrer la matriz (una función nativa de PHP)?
[
0 => 'blabla',
1 => 'blabla',
2 => 'blblll',
// etc ...
]
eric goodwin
Si tiene una matriz de claves que desea usar, use array_combine
Dado $keys = array(‘a’, ‘b’, ‘c’, …) y su matriz, $list, haga esto:
$list = array_combine($keys, array_values($list));
La lista ahora será una matriz (‘a’ => ‘blabla 1’, …) etc.
tienes que usar array_values
para extraer solo los valores de la matriz y no las antiguas claves numéricas.
Tiene un aspecto agradable y simple, pero array_values hace una copia completa de la matriz, por lo que podría tener problemas de espacio. Todo lo que estamos haciendo aquí es dejar que php haga el bucle por nosotros, no eliminar el bucle. Estaría tentado a hacer algo más como:
foreach ($list as $k => $v) {
unset ($list[$k]);
$new_key = *some logic here*
$list[$new_key] = $v;
}
No creo que sea más eficiente que el primer código, pero proporciona más control y no tendrá problemas con la longitud de las matrices.
Kent Federico
No, no hay, para empezar, es imposible tener una matriz con elementos que comparten la misma clave
$x =array();
$x['foo'] = 'bar' ;
$x['foo'] = 'baz' ; #replaces 'bar'
En segundo lugar, si desea simplemente prefijar los números para que
$x[0] --> $x['foo_0']
Eso es computacionalmente inverosímil de hacer sin bucles. Actualmente no existen funciones php para la tarea de “prefijar teclas”, y lo más parecido es “extracto” que prefijará las teclas numéricas antes de convertirlas en variables.
La forma más sencilla es esta:
function rekey( $input , $prefix ) {
$out = array();
foreach( $input as $i => $v ) {
if ( is_numeric( $i ) ) {
$out[$prefix . $i] = $v;
continue;
}
$out[$i] = $v;
}
return $out;
}
Además, al leer el uso de XMLWriter, creo que estaría escribiendo XML de mala manera.
<section>
<foo_0></foo_0>
<foo_1></foo_1>
<bar></bar>
<foo_2></foo_2>
</section>
No es un buen XML.
<section>
<foo></foo>
<foo></foo>
<bar></bar>
<foo></foo>
</section>
Es mejor XML, porque cuando se interpreta, los nombres duplicados no importan porque todos están compensados numéricamente así:
section => {
0 => [ foo , {} ]
1 => [ foo , {} ]
2 => [ bar , {} ]
3 => [ foo , {} ]
}
Aurelien
Este es un ejemplo prefijando todas las teclas con un guión bajo.
Usamos array_combine
para combinar las claves de la matriz con los valores de la matriz, pero primero ejecutamos un array_map
función en las teclas de matriz, que toma una función simple que agrega el prefijo.
$prefix = '_';
$arr = array_combine(
array_map(function($v) use ($prefix){
return $prefix.$v;
}, array_keys($arr)),
array_values($arr)
);
Ver un ejemplo en vivo aquí.
Agregué esto como respuesta a otra pregunta y me pareció relevante. Con suerte, podría ayudar a alguien que necesita cambiar el valor de las claves en una matriz. Utiliza funciones integradas para php.
$inputArray = array('app_test' => 'test', 'app_two' => 'two');
/**
* Used to remap keys of an array by removing the prefix passed in
*
* Example:
* $inputArray = array('app_test' => 'test', 'app_two' => 'two');
* $keys = array_keys($inputArray);
* array_walk($keys, 'removePrefix', 'app_');
* $remappedArray = array_combine($keys, $inputArray);
*
* @param $value - key value to replace, should be from array_keys
* @param $omit - unused, needed for prefix call
* @param $prefix - prefix to string replace in keys
*/
function removePrefix(&$value, $omit, $prefix) {
$value = str_replace($prefix, '', $value);
}
// first get all the keys to remap
$keys = array_keys($inputArray);
// perform internal iteration with prefix passed into walk function for dynamic replace of key
array_walk($keys, 'removePrefix', 'app_');
// combine the rewritten keys and overwrite the originals
$remappedArray = array_combine($keys, $inputArray);
// see full output of comparison
var_dump($inputArray);
var_dump($remappedArray);
Producción:
array(2) {
'attr_test' =>
string(4) "test"
'attr_two' =>
string(3) "two"
}
array(2) {
'test' =>
string(4) "test"
'two' =>
string(3) "two"
}
La solución a cuando estás usando XMLWriter
(nativo de PHP 5.2.x
$xml->startElement(‘itemName’); esto reemplazará la clave de matrices.
manoj sharma
cambie el nombre de la clave de matriz “grupo” a “niños”.
<?php
echo json_encode($data);
function array_change_key_name( $orig, $new, &$array ) {
foreach ( $array as $k => $v ) {
$res[ $k === $orig ? $new : $k ] = ( (is_array($v)||is_object($v)) ? array_change_key_name( $orig, $new, $v ) : $v );
}
return $res;
}
echo '<br>=====change "group" to "children"=====<br>';
$new = array_change_key_name("group" ,"children" , $data);
echo json_encode($new);
?>
resultado:
{"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","group":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","group":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","group":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
=====change "group" to "children"=====
{"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","children":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","children":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","children":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
LPL
Creo que quiere:
$a = array(1=>'first_name', 2=>'last_name');
$a = array_flip($a);
$a['first_name'] = 3;
$a = array_flip($a);
print_r($a);
-
Esto hace todo tipo de suposiciones, como que los valores de la matriz $a son cadenas y todos son únicos.
– Jasón
2 mayo 2013 a las 14:44
-
Es fácil hacer suposiciones cuando la pregunta es vaga, poco clara, falta un ejemplo reproducible mínimo y… imposible.
– mickmackusa
17 abr a las 23:28
¿Estoy leyendo esto bien? Parece que desea que todos los elementos de una matriz tengan la misma clave.
– victoria
21 de noviembre de 2008 a las 13:14
Lo hago, es para traducir la matriz a XML.
– jeff atwood
21 de noviembre de 2008 a las 13:15
Las claves de matriz tienen que ser únicas, ¿cómo intenta convertir esto a XML? ¿Puede publicar un ejemplo de código?
– Neil Aitken
21 de noviembre de 2008 a las 13:18
Usar escritor XML que no permite elementos de inicio numéricos.
– Estera
21 de noviembre de 2008 a las 13:19
Para una pregunta canónica que tiene tantas señales, esta es una pregunta decididamente pobre con requisitos vagos/imposibles. Seguramente Stack Overflow tiene algo mejor que esto para ofrecer al mundo del desarrollo de software.
– mickmackusa
17 abr a las 21:38