Gibt es eine Möglichkeit, alle Schlüssel in einem flachen indizierten Array in dieselbe Zeichenfolge (“Name”) zu ändern? [closed]

Lesezeit: 4 Minuten

Gibt es eine Möglichkeit, alle Zifferntasten in “Name” zu ändern, ohne das Array zu durchlaufen (eine native PHP-Funktion)?

[
    0 => 'blabla',
    1 => 'blabla',
    2 => 'blblll',
    // etc ...
]

  • Lese ich das richtig? Es sieht so aus, als ob Sie möchten, dass alle Elemente in einem Array denselben Schlüssel haben.

    – Viktoria

    21. November 2008 um 13:14 Uhr

  • Ich tue es, um das Array in XML zu übersetzen.

    Jeff Atwood

    21. November 2008 um 13:15 Uhr

  • Array-Schlüssel müssen eindeutig sein, wie versuchen Sie, dies in XML zu konvertieren, können Sie ein Codebeispiel posten?

    – Neil Aitken

    21. November 2008 um 13:18 Uhr

  • Verwendung von XML-Writer, der keine numerischen startElements zulässt.

    Matte

    21. November 2008 um 13:19 Uhr

  • Für eine kanonische Frage mit so vielen Wegweisern ist dies eine ausgesprochen schlechte Frage mit vagen/unmöglichen Anforderungen. Sicherlich hat Stack Overflow der Welt der Softwareentwicklung etwas Besseres zu bieten.

    – mickmackusa

    gestern

Benutzeravatar von Eric Goodwin
Eric Goodwin

Wenn Sie ein Array von Schlüsseln haben, die Sie verwenden möchten, verwenden Sie array_combine

Gegeben $keys = array(‘a’, ‘b’, ‘c’, …) und Ihr Array, $list, dann tun Sie dies:

$list = array_combine($keys, array_values($list));

Liste wird jetzt array(‘a’ => ‘blabla 1’, …) etc.

Sie müssen verwenden array_values um nur die Werte aus dem Array zu extrahieren und nicht die alten, numerischen Schlüssel.

Das sieht nett und einfach aus, aber array_values ​​erstellt eine vollständige Kopie des Arrays, sodass Sie Platzprobleme haben könnten. Alles, was wir hier tun, ist, PHP das Schleifen für uns erledigen zu lassen, nicht die Schleife zu eliminieren. Ich wäre versucht, etwas mehr zu tun wie:

foreach ($list as $k => $v) {
   unset ($list[$k]);

   $new_key =  *some logic here*

   $list[$new_key] = $v;
}

Ich glaube nicht, dass es so viel effizienter ist als der erste Code, aber es bietet mehr Kontrolle und wird keine Probleme mit der Länge der Arrays haben.

Benutzeravatar von Kent Fredric
Kent Fredrik

Nein, gibt es nicht, für den Anfang ist es unmöglich, ein Array mit Elementen zu haben, die denselben Schlüssel teilen

$x =array(); 
$x['foo'] = 'bar' ; 
$x['foo'] = 'baz' ; #replaces 'bar'

Zweitens, wenn Sie den Nummern lediglich ein Präfix voranstellen möchten

$x[0] --> $x['foo_0']  

Das ist rechnerisch unplausibel ohne Schleifen. Derzeit gibt es keine PHP-Funktionen für die Aufgabe des “Schlüsselpräfixierens”, und das kommt dem am nächsten “Extrakt” wodurch numerische Tasten vorangestellt werden, bevor sie zu Variablen werden.

Der einfachste Weg ist dieser:

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;
}

Darüber hinaus glaube ich, wenn Sie die Verwendung von XMLWriter lesen, dass Sie XML auf schlechte Weise schreiben würden.

<section> 
    <foo_0></foo_0>
   <foo_1></foo_1>
   <bar></bar>
   <foo_2></foo_2>
</section>

Ist kein gutes XML.

<section> 
   <foo></foo>
   <foo></foo>
   <bar></bar>
   <foo></foo>
</section>

Ist besser XML, denn bei der Interpretation spielen die doppelten Namen keine Rolle, da sie alle numerisch wie folgt versetzt sind:

section => { 
    0 => [ foo , {} ]
    1 => [ foo , {} ]
    2 => [ bar , {} ]
    3 => [ foo , {} ] 
}

Aureliens Benutzeravatar
Aurelien

Dies ist ein Beispiel, bei dem allen Tasten ein Unterstrich vorangestellt wird.

Wir gebrauchen array_combine um die Array-Schlüssel mit den Array-Werten zu kombinieren, aber wir führen zuerst eine aus array_map Funktion auf den Array-Schlüsseln, die eine einfache Funktion übernimmt, die das Präfix hinzufügt.

$prefix = '_';
$arr = array_combine(
    array_map(function($v) use ($prefix){
       return $prefix.$v;
    }, array_keys($arr)),
    array_values($arr)
);

Sehen Sie sich ein Live-Beispiel an Hier.

Ich habe dies als Antwort auf eine andere Frage hinzugefügt und schien relevant zu sein. Hoffentlich könnte jemandem helfen, der den Wert der Schlüssel in einem Array ändern muss. Verwendet eingebaute Funktionen für 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);

Ausgang:

array(2) {
  'attr_test' =>
  string(4) "test"
  'attr_two' =>
  string(3) "two"
}
array(2) {
  'test' =>
  string(4) "test"
  'two' =>
  string(3) "two"
}

Die Lösung, wenn Sie verwenden XMLWriter (heimisch PHP 5.2.x<) verwendet $xml->startElement(‘itemName’); Dadurch wird der Arrays-Schlüssel ersetzt.

Benutzeravatar von Manoj Sharma
Manoj Sharma

Ändern Sie den Namen des Array-Schlüssels “Gruppe” in “Kinder”.

<?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);
?>

Ergebnis:

{"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"}]}]}]}]}

Benutzeravatar von LPL
LPL

Ich denke, dass er will:

$a = array(1=>'first_name', 2=>'last_name');
$a = array_flip($a);

$a['first_name'] = 3;
$a = array_flip($a);

print_r($a);

  • Dies macht alle möglichen Annahmen, wie zum Beispiel, dass die $a-Array-Werte alle Zeichenfolgen und alle eindeutig sind.

    – Jason

    2. Mai 2013 um 14:44 Uhr

  • Es ist leicht, Vermutungen anzustellen, wenn die Frage vage und unklar ist, ein reproduzierbares Minimalbeispiel fehlt und … unmöglich ist.

    – mickmackusa

    gestern


1449260cookie-checkGibt es eine Möglichkeit, alle Schlüssel in einem flachen indizierten Array in dieselbe Zeichenfolge (“Name”) zu ändern? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy