2015-08-31 5 views
2

Я хочу изменить имя ключа в многомерном массиве.Переименование ключа в многомерном массиве

Мой массив:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [fruit namé] => Banana 
     ) 
    [1] => Array 
     (
      [id] => 2 
      [fruit namé] => Apple 
     ) 
) 

Моя функция:

function renameFields($old, $new, $arr) { 
    foreach ($arr as $k=>$v) { 
     $arr[$k][$new] = $arr[$k][$old]; 
     unset($arr[$k][$old]); 
    } 
} 

renameFields("fruit namé", "name", $arr); 

-

Он работает для id, но не тогда, когда акцент как fruit namé.

-

EDIT
Я знаю, что это плохая практика, чтобы иметь какой-то специальный символ как ключ, но это Datas пришел из французской системы ...

+0

Почему вы делаете 'global $ arr;', если вы передаете '$ arr' вашей функции? –

+0

Я удалил его из функции. – pocpoc

+0

Возможный дубликат [В PHP, как вы меняете ключ элемента массива?] (Http://stackoverflow.com/questions/240660/in-php-how-do-you-change-the-key-of -an-array-element) – Pavlin

ответ

2

Вам нужно либо а) передача $arr к вашей функции ссылка или b) есть renameFields вернуть обновленный массив.

Ваш код в настоящее время изменяет копию $arr массива (потому что это то, что переходит в руки renameFields, когда это называется), и никогда не обновляет тот, который существует вне функции renameFields.

Итак, вам необходимо либо сделать:

function renameFields($old, $new, &$arr) { 
    foreach ($arr as $k=>$v) { 
     $arr[$k][$new] = $arr[$k][$old]; 
     unset($arr[$k][$old]); 
    } 
} 

renameFields("fruit name", "name", $arr); 

, который будет проходить $arr по ссылке.

Или:

function renameFields($old, $new, $arr) { 
    foreach ($arr as $k=>$v) { 
     $arr[$k][$new] = $arr[$k][$old]; 
     unset($arr[$k][$old]); 
    } 

    return $arr; 
} 

$arr = renameFields("fruit name", "name", $arr); 

Какой будет функция возвращает обновленный массив, а затем вам нужно затем обновить переменную.

P.S. Вам не нужно global $arr; в любом случае здесь.

+0

Оба решения сделали то же самое. «Имя фрукта» все еще здесь, и он добавил в конце массива новый ключ под названием «имя». – pocpoc

+0

@pocpoc: Оба работали отлично для меня: http://codepad.org/49Uyac6k и http://codepad.org/cETp3doJ –

+0

Поскольку он использует глобальную функцию в исходной функции, это не должна быть копия массива , но сам массив, который он модифицирует. Однако это было бы более правильным способом. –

2

Не следует использовать пробелы в именах ваших ключей. Вы можете это сделать, но это плохая практика.

Вот что я придумал:

$my_array = array(
    array(
     'id' => 1, 
     'fruit name' => 'Banana' 
    ), 
    array(
     'id' => 2, 
     'fruit name' => 'Apple' 
    ) 
); 

function renameFields($old, $new, $arr) { 
    $new_a = array(); 
    foreach ($arr as $a) { 
     $new_a[] = array(
      'id' => $a['id'], 
      $new => $a[$old] 
     ); 
    } 
    return $new_a; 
} 

$new_array = renameFields("fruit name", "name", $my_array); 

echo "<pre>"; 
print_r($new_array); 
echo "</pre>"; 

Это гораздо лучше идея передать массив в функцию, а не с использованием глобальной.

+0

Почему «неправильная практика» использует пробелы в именах ключей? –

+0

php все равно, какие символы имеют в имени ключа. в конце концов, они просто струны. Это может быть «плохая практика» в ДРУГИХ языках, таких как js, где вы можете использовать 'array.key' в качестве короткой ссылки для доступа вместо' array [key] '. –

+0

Я думаю, что на самом деле это не плохая практика иметь пробелы в именах ключей, но больше предпочтений. Большинство компаний, которые устанавливают стандарты для именования, не используют пробелы в именах ключей. Не используя пробелы, он просто сохраняет соглашения об именах по всей доске. – GrumpyToaster

Смежные вопросы