¿Hay alguna manera de cambiar todas las claves en una matriz indexada plana a la misma cadena (“Nombre”)? [closed]

4 minutos de lectura

¿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 ...
]

  • ¿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

Avatar de usuario de Eric Goodwin
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.

Avatar de usuario de Kent Fredric
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 , {} ] 
}

Avatar de usuario de Aurelien
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.

Avatar de usuario de Manoj Sharma
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"}]}]}]}]}

Avatar de usuario de LPL
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


¿Ha sido útil esta solución?