PHP Изменить Массив Ключи - PullRequest
40 голосов
/ 21 ноября 2008
Array( 0 => 'blabla',
       1 => 'blabla',
       2 => 'blblll' ) etc..

Есть ли способ изменить все числовые ключи на «Имя» без циклического перемещения по массиву (например, функция php)?

Ответы [ 12 ]

99 голосов
/ 21 ноября 2008

Если у вас есть массив ключей, которые вы хотите использовать, используйте array_combine

Учитывая $ keys = array ('a', 'b', 'c', ...) и ваш массив $ list, затем сделайте следующее:

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

Список теперь будет массивом ('a' => 'blabla 1', ...) и т. Д.

Вы должны использовать array_values, чтобы извлечь только значения из массива, а не старые, числовые ключи.

Это красиво и просто, но array_values ​​создает полную копию массива, поэтому у вас могут возникнуть проблемы с пространством. Все, что мы здесь делаем, это позволяем php делать за нас цикл, а не устранять цикл. Я бы соблазнился сделать что-то более похожее на:

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

   $new_key =  *some logic here*

   $list[$new_key] = $v;
}

Я не думаю, что это намного эффективнее, чем первый код, но он обеспечивает больший контроль и не будет иметь проблем с длиной массивов.

22 голосов
/ 21 ноября 2008

Нет, нет, для начала, невозможно иметь массив с элементами с одинаковым ключом

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

Во-вторых, если вы хотите просто поставить префикс перед цифрами, чтобы

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

Это вычислительно невозможно сделать без зацикливания. В настоящее время нет никаких php-функций для задачи «префикса ключа», и самым близким является «extract» , который будет ставить префикс числовых ключей перед тем, как сделать их переменными.

Самый простой способ такой:

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

Кроме того, после прочтения использования XMLWriter я думаю, что вы будете писать XML неправильно.

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

Не очень хороший XML.

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

Лучше XML, потому что при толковании дублирующиеся имена не имеют значения, потому что все они численно смещены, например:

section => { 
    0 => [ foo , {} ]
    1 => [ foo , {} ]
    2 => [ bar , {} ]
    3 => [ foo , {} ] 
}
4 голосов
/ 23 июня 2015

Я добавил это для ответа на другой вопрос и показался мне актуальным. Надеюсь, может помочь кто-то, кто должен изменить значение ключей в массиве. Использует встроенные функции для 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);

Выход:

array(2) {
  'attr_test' =>
  string(4) "test"
  'attr_two' =>
  string(3) "two"
}
array(2) {
  'test' =>
  string(4) "test"
  'two' =>
  string(3) "two"
}
4 голосов
/ 31 декабря 2014
$prefix = '_';
$arr = array_combine(
    array_map(function($v) use ($prefix){
       return $prefix.$v;
    }, array_keys($arr)),
    array_values($arr)
);
2 голосов
/ 09 января 2013

изменить имя ключа массива "group" на "children".

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

результат:

{"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"}]}]}]}]}
2 голосов
/ 31 марта 2010

Я думаю, что он хочет:

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

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

print_r($a);
2 голосов
/ 21 ноября 2008

Решение, когда вы используете XMLWriter (собственный для PHP 5.2.x <), использует <code>$xml->startElement('itemName');, это заменит ключ массива.

1 голос
/ 06 июня 2017

Чтобы иметь одинаковые ключи, я думаю, они должны быть в отдельных вложенных массивах.

for ($i = 0; $i < count($array); $i++) {
    $newArray[] = ['name' => $array[$i]];
};

Выход:

0 => array:1 ["name" => "blabla"]
1 => array:1 ["name" => "blabla"]
2 => array:1 ["name" => "blblll"]
1 голос
/ 12 июня 2015
<?php
    $array[$new_key] = $array[$old_key];
    unset($array[$old_key]);
?>
1 голос
/ 04 мая 2012

Я сделал это для массива объектов. Это в основном создание новых ключей в том же массиве и удаление старых ключей.

public function transform($key, $results)
{
    foreach($results as $k=>$result)
    {
        if( property_exists($result, $key) )
        { 
            $results[$result->$key] = $result;
            unset($results[$k]);
        }
    }

    return $results;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...