@draaax

Как вставить в массив данные зная путь?

Здравствуйте. Можно ли имея $path вставить в $array данные из $names?

С определёнными условиями:
1. Последний ключ не существует в $array, т.е. test.
2. Если $path = explode('.', 'lang.goods');, то просто должно добавить значение без ключа.

$path = explode('.', 'lang.main.test');

$array = [
  'ru' => [
    'lang' => [
      'goods' => [
        'товар',
        'товара',
        'товаров'
      ],
      'main' => [
        'title' => 'Title'
      ]
    ]
  ],
  'en' => [
    'lang' => [
      'goods' => [
        'товар',
        'товара',
        'товаров'
      ],
      'main' => [
        'title' => 'My Title'
      ]
    ]
  ]
];

$names = [
	'ru' => 'value1',
	'en' => 'value2'
];


Результат:

$array = [
  'ru' => [
    'lang' => [
      'goods' => [
        'товар',
        'товара',
        'товаров'
      ],
      'main' => [
        'title' => 'Title',
        'test' => 'value1'
      ]
    ]
  ],
  'en' => [
    'lang' => [
      'goods' => [
        'товар',
        'товара',
        'товаров'
      ],
      'main' => [
        'title' => 'My Title',
        'test' => 'value2'
      ]
    ]
  ]
];
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
@dimoff66
Кратко о себе: Я есть
function insertData($arr, $names, $path) {
    $pathArr = explode('.', $path);
    $lastKey = array_pop($pathArr);
    foreach ($names as $lang => $value) {
        $branch = &$arr[$lang];
        foreach($pathArr as $pathPart) {
            if(!isset($branch[$pathPart])) {
                $branch = null;
                break;
            }
            
            $branch = &$branch[$pathPart];
        }
        
        if(!$branch) continue;

        if($lastKey === 'goods') {
            if(!isset($branch['goods'])) $branch['goods'] = [];
            $branch['goods'][] = $value;
        } else if (!isset($branch[$lastKey])) {
            $branch[$lastKey] = $value;
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега PHP
Web developer
$array['ru'][$path[0]][$path[1]][$path[2]] = 'value1',
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы