Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
5 / 6 / 4
Регистрация: 03.12.2009
Сообщений: 267

Динамическое изменение n-мерного массива

11.09.2016, 23:48. Показов 1873. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Потребовалось динамически заполнять данными массивы произвольной размерности. Имею на входе массив с ключами array('key1','key2','key3',....'keyn'). Нужно присвоить значение элементу массива $arr['key1']['key2']['key3']...['keyn']. С помощью какого алгоритма можно это сделать? Пытался играться со ссылками:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function setToArray(&$data, $keys, $value)
{
    $key = array_shift($keys);
    if(!isset($data[$key]))
    {
        $data[$key] = array();
    }
    if(!empty($keys))
    {
        setToArray($data[$key], $keys, $value);
    }
    else
    {
        $data[$key][] = $value;
    }
}
Но ничего не получилось. Не работает и такой вариант:

PHP
1
2
3
4
$items = array();
$key = "['test']";
 
$items$key = 1;
Есть ли в PHP способ запрограммировать такую логику? Есть идея с созданием нового массива с нужными ключами и последующим объединением массива с исходным. Но это уже крайний случай..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2016, 23:48
Ответы с готовыми решениями:

Сортировка много мерного массива
Добрый день! Помогите пожалуйста отсортировать многомерный массив $PLACEMARKS следующего вида $PLACEMARKS = array(); $i=0; ...

Сортировка 2 мерного массива
Ломаю голову уже третий день. есть массив : $arr1 = array('desc' => 'Первый desc', 'url' => 'http://hgdb'); $arr1 = array('desc'...

Как подсчитать количество элементов 2-х мерного массива?
Здравствуйте! Подскажите, кто знает, как можно подсчитать количество элементов 2-х мерного массива. Только не абсолютно всех его...

6
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
12.09.2016, 00:04
запускаешь while и без рекурсии стучишся до последнего
rray('key1','key2','key3',....'keyn') и $arr['key1']['key2']['key3']...['keyn'] разные массивы по структуре
0
5 / 6 / 4
Регистрация: 03.12.2009
Сообщений: 267
12.09.2016, 00:16  [ТС]
Что-то вы не в тему пишите. С чего массивам быть одинаковой структуры? Первый массив хранит последовательность и вложенность ключей, по которым мне нужно положить значение во второй массив. Названия и структура не случайны. Покажите мне функцию, которая с помощью while может обратиться к элементу с ключами из первого массива и присвоить ему значение.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
12.09.2016, 01:23
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arr['key1']['key2']['key3']['keyn'] = 'Ivan';
$key = ['key1', 'key2', 'key3', 'keyn'];
 
function set(&$array, $key, $value)
{
    $tmp = &$array;
    while (count($key) != 1) {
        $tmp = &$tmp[array_shift($key)];
    };
    $tmp[array_shift($key)] = $value;
}
 
set($arr, $key, 'Petr');
var_dump($arr['key1']['key2']['key3']['keyn']); //"Petr"
думаю вы сами улучшите код
песочница
1
5 / 6 / 4
Регистрация: 03.12.2009
Сообщений: 267
12.09.2016, 11:57  [ТС]
Спасибо! А можете объяснить необходимость строки 6 в вашем примере? Ведь в функцию уже передаётся ссылка. Только после использования $tmp мой рекурсивный вариант заработал
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function setToArray(&$data, $keys, $value)
{   
    $tmp = &$data;
    $key = array_shift($keys);
    if(!isset($tmp[$key]))
    {
        $tmp[$key] = array();
    }
    if(!empty($keys))
    {
        setToArray($tmp[$key], $keys, $value);
    }
    else
    {
        $tmp[$key] = $value;
    }
}
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
12.09.2016, 16:58
Цитата Сообщение от Karpo Посмотреть сообщение
необходимость строки 6
магия Php, я же сразу написал не стоит использовать рекурсию вот как решал я подобную задачу
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
25
26
27
28
 /**
     * Set value
     * Value::set('name', $value)
     *
     * @param string $name
     * @param mixed $value
     */
    public static function set($name, $value)
    {
        if (false === strpos($name, '.')) {
            $GLOBALS[$name] = $value;
        } else {
            $arr = explode('.', $name);
            $key = '_' . strtoupper(array_pop($arr));
            if (!isset($GLOBALS[$key])) {
                $GLOBALS[$key] = array();
            }
            $current = &$GLOBALS[$key];
            $key = array_pop($arr);
            foreach ($arr as $i => $v) {
                if (!isset($current[$v])) {
                    $current[$v] = array();
                }
                $current = &$current[$v];
            }
            $current[$key] = $value;
        }
    }
тест PHPUnit
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
25
26
27
28
29
30
31
32
33
 /**
     * Test set
     */
    public function test_set()
    {
        Value::set('name', 'Ivan');
        static::assertEquals(
            'Ivan',
            Value::get('name'),
            'Value is OK'
        );
        static::assertEquals(
            'Ivan',
            $GLOBALS['name'],
            'Value is OK'
        );
        Value::set('name.post', 'Ivan');
        static::assertEquals(
            'Ivan',
            Value::get('name.post'),
            'Value is OK'
        );
        static::assertEquals(
            'Ivan',
            $GLOBALS['_POST']['name'],
            'Value is OK'
        );
        static::assertEquals(
            'Ivan',
            $_POST['name'],
            'Value is OK'
        );
    }
Value::set('key1.key2.key3', 'value');
0
5 / 6 / 4
Регистрация: 03.12.2009
Сообщений: 267
12.09.2016, 17:02  [ТС]
Я же говорю, мой вариант заработал после того как я переписал всё через ссылку $tmp, взятую из вашего примера) Так что с рекурсией никаких проблем. Мне мой вариант кажется более элегантным) Оставлю его. В любом случае спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2016, 17:02
Помогаю со студенческими работами здесь

Динамическое изменение переменной
Доброго дня! Вопрос следующий - возможно ли динамическое присваивание переменной php значения переменной javascript (изменилось значение...

Динамическое изменение атрибутов в xml
В xml-шаблоне, показанном ниже, мне нужно изменить по определённому действию пользователя атрибут src тега img. Так как у тега img есть id...

Сортировка 3х мерного массива PHP
Добрый день, необходимо отсортировать массив вида: Array ( => 2 => Array ( => 1 ...

Динамическое изменение Select option
Добрые люди, подскажите, дана форма с данными пользователя: фамилия и имя, группа и т.д. И после них размещены поля которые редактируют эти...

Подскажите как сделать динамическое изменение
Собственно вопрос такой. Есть форма с одним полем select и несколькими текстовыми полями, Значения, которые находятся в поле select...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru