@enigma2030

Перебор и замена данных в многомерном массиве?

Добрый день. Подскажите пожалуйста как можно более изящно (при этом не снижая производительность) сделать следующее.

У нас есть некий массив
$a = [
		1 => [
			3 => [
				"logo" => "logo_3_1",
				"cover" => "cover_3_1"
			],
			4 => [
				"logo" => "logo_4_1",
			]
		],
		2 => [
			5 => [
				"logo" => "logo_5_2",
				"cover" => "cover_5_2"
			]
		]
	];


В нем хранятся определенные сущности, у которых есть идентификаторы (logo_3_1, cover_3_1 и т.д).

Задача.
Нужно пройтись по этому массиву и выбрать эти идентификаторы. Потому на основании их будет сделана выборка и мы получим пути к изображениям.

Сейчас это реализована через foreach вложенный в foreach и т.д. Что для выборки идентификаторов что для замены их на пути.

Попробовал использовать итераторы
$r = [];

$ai = new RecursiveArrayIterator($a);
$ari = new RecursiveIteratorIterator($ai);

foreach ($ari as $key => $value) {
	array_push($r, $value);
}

В результате в $r у нас есть все идентификаторы.

А вот тоже самое провернуть с обновлением исходного массива не получается. Т.е так же самая конструкция не позволяет нам обновить значение.
function simpleIterator($iterator, $result)
	{
		while ($iterator->valid()) { 
	        if ($iterator->hasChildren()) {
  				simpleIterator($iterator->getChildren(), $result); 
	        } 
	        else {
	        	if ($result[$iterator->current()]) {
	        		$iterator->offsetSet($iterator->key(), $result[$iterator->current()]);
	        	};
	        }

	        $iterator->next(); 
	    }
	};

iterator_apply($ai, 'simpleIterator', [$ai, $images]);


Подскажите пожалуйста, что я делаю не так, возможно выбранный подход тупиковый.
  • Вопрос задан
  • 882 просмотра
Пригласить эксперта
Ответы на вопрос 2
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Нужно пройтись по этому массиву и выбрать эти идентификаторы. Потому на основании их будет сделана выборка и мы получим пути к изображениям.

array_map() не пойдёт?

P.S. Там справа ещё пачка функий на эту же тему.
Ответ написан
abler98
@abler98
Software Engineer
<?php

$a = [
    1 => [
        3 => [
            'logo' => 'logo_3_1',
            'cover' => 'cover_3_1',
        ],
        4 => [
            
        ]
    ],
    2 => [
        5 => [
            'logo' => 'logo_5_2',
            'cover' => 'cover_5_2',
        ]
    ]
];

$logos = [
    'logo_3_1' => 'L31',
    'logo_4_1' => 'L41',
];

array_walk_recursive($a, function (&$item, $key) use ($logos) {
    if (in_array($key, ['logo', 'cover'])) {
        if (array_key_exists($item, $logos)) {
            $item = $logos[$item];
        }
    }
});

echo '<pre>';
var_dump($a);
echo '</pre>';
Ответ написан
Ваш ответ на вопрос

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

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