Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
1

Переименовать ключи массива

28.06.2011, 17:37. Показов 7427. Ответов 6

Author24 — интернет-сервис помощи студентам
Когда данные приходят с формы, было бы удобно использовать функцию, которая переименует ключи определенным образом (скажем в более подходящей для сохранения в БД).

Итак требуется переименовать ключи массива A, как переименовывать заданы массивом B. Желательно для те ключи, для которых переименование не задано - не трогать. Если заданы переименования ключей которых нет - не создавать такие ключи в результирующем массиве. Порядок ключей желательно оставить как в оригинальном массиве или сделать их в том порядке в котором они заданы в массиве переименований. Идеально было бы регулировать это дополнительным параметром)

И, конечно, все это без циклов

Пример входных данных:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$a = array(
    'id' => 10,
    'name' => 'Test 1',
    'price_vat' => 234,
    'price_sim' => 343,
    'include' => 1,
);
$b = array(
    'id' => 'ID',
    'name' => 'NAME',
    'price_vat' => 'PRICE_1',
    'price_sim' => 'PRICE_2',
    /*'include' => 'ACTIVE',*/
    'test' => 'ABC',
);
/*
$a = array(
    'ID' => 10,
    'NAME' => 'Test 1',
    'PRICE_1' => 234,
    'PRICE_2' => 343,
    'include' => 1,
);
*/
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2011, 17:37
Ответы с готовыми решениями:

Как проверить вхождение ключей одного массива в ключи другого массива?
Есть два массива $arrayWord = , 1=>, 2=>, 3=> ]; ...

Ключи массива сессии
Здравствуйте.Собственно интересует вопрос: Почему значение с целочисельным ключом, например 0, не...

Ключи массива $_POST
Здравствуйте мне на сайт прилетают заявки не понятно откуда всегда с разных айпи причём с...

Упорядочить ключи массива
Здравствуйте. Помогите пожалуйста мне со следующей программой. Имеется два массива. массив "а" и...

6
Vovan-VE
28.06.2011, 17:52
  #2

Не по теме:

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

0
36 / 36 / 3
Регистрация: 24.06.2011
Сообщений: 50
28.06.2011, 20:29 3
PHP
1
2
3
4
function array_substitute_keys(&$subject, $key_names, $sort_by_keynames=false) {
    !$sort_by_keynames or $subject = array_merge(array_intersect_key($key_names, $subject),$subject);
    $subject = array_flip(str_replace(array_keys($key_names),array_values($key_names),array_flip($subject)));
}
Исходные данные
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$a = array(
        'name' => 'Test 1',
        'id' => 10,
        'price_vat' => 234,
        'include' => 1,
        'price_sim' => 343,
);
$b = array(
        'id' => 'ID',
        'name' => 'NAME',
        'price_sim' => 'PRICE_2',
        'price_vat' => 'PRICE_1',
        /*'include' => 'ACTIVE',*/
        'test' => 'ABC',
);


PHP
1
2
array_substitute_keys($a,$b);
print_r($a);
Код
Array
(
    [NAME] => Test 1
    [ID] => 10
    [PRICE_1] => 234
    [include] => 1
    [PRICE_2] => 343
)
--------------------------

PHP
1
2
array_substitute_keys($a,$b,true);
print_r($a);
Код
Array
(
    [ID] => 10
    [NAME] => Test 1
    [PRICE_2] => 343
    [PRICE_1] => 234
    [include] => 1
)
2
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.06.2011, 20:53 4
А если в исходных данных разные ключи будут иметь одинаковые значения?
2
36 / 36 / 3
Регистрация: 24.06.2011
Сообщений: 50
28.06.2011, 21:21 5
PHP
1
2
3
4
5
function array_substitute_keys(&$subject, $key_names, $sort_by_keynames=false) {
    !$sort_by_keynames or $subject = array_merge(array_intersect_key($key_names, $subject),$subject);
    $keys = str_replace(array_keys($key_names),array_values($key_names),array_keys($subject));
    $subject = array_combine(array_values($keys), $subject);
}

Не по теме:

Vovan-VE, а ты крут!

2
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
28.06.2011, 22:55  [ТС] 6
Вообще изначально когда я только начал писать первый пост, мне пришла в голову идея, которую я тут же обличил в код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* Переименовывает ключи массива $a указанными в $b заменами
* @param array $a Исходный массив
* @param array $b Массив соответствия старых ключей новым (необходимым)
*/
function array_rename($a, $b)
{
    $ak = array_keys($a);
    $b = array_intersect_key($b, $a)+array_combine($ak,$ak);
    ksort($a); ksort($b);
 
    return array_combine(array_values($b), $a);
}
Это в принципе тоже решение задачи. Потом чтобы все таки поделиться задачей, дописал доп. условия по сортировке. Хотел и сам их решить, но заработался)
1
36 / 36 / 3
Регистрация: 24.06.2011
Сообщений: 50
28.06.2011, 23:59 7
Тоже хотел делать именно таким способом(добавить недостающие значения, всё сортировать и подставить замены), пока не дочитал условие о сортировке.

Такое решение намного проще. Это видно даже невооруженным глазом, банально, по количеству и сложности кода.
0
28.06.2011, 23:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2011, 23:59
Помогаю со студенческими работами здесь

Заменить ключи массива
есть массив Array ( => Array ( => 122611 => 4022 ...

Вывести определенные ключи из массива
Добрый день! Есть массив 1 и массив 2, как из массива 1 вывести ключи которые соответствуют...

А как изменить ключи массива?
Ребята, вот и встал такой, простой как кажется, но не решённый мной вопрос. Вот есть массив, ключи...

Как создать пустые ключи массива
у меня есть массив вида => Array ( => Барановский Максим Викторович ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru