Сортировка массива по последнему добавляемому элементу

panfilov

Новичок
Добрый день!
Подскажите пожалуйста как сделать так чтобы каждое последнее значение добавляемое в многомерный ассоциативный массив, при совпадении имён перезаписывалось в конец массива.
То есть, если есть a[ b ][ c ], a[ d ][ e ] и мы добавляем a[ b ][ f ]:

PHP:
[ a ] => Array
(
     [ b ] => Array
     (
          [ c ] => 111
     )

     [ d ] => Array
     (
          [ e ] => 222
     )
)

a[ b ][ f ] = 333;
то у нас вышло:

PHP:
[ a ] => Array
(
     [ d ] => Array
     (
          [ e ] => 222
     )

     [ b ] => Array
     (
          [ c ] => 111
          [ f ] => 333
     )
)
Мне нужно создать структуру данных из которой будут выводиться работы от последней к первой.

Массив создаётся таким образом:

PHP:
for ($j = 0; $j < count($client); $j++)
{
        for ($i = 0; $i < $client_count[$client[$j]]; $i++)
        {
                $struct[$client[$j]] [$brand[$i]] [$id[$i]] = $name[$i];
        }
}
В результате выводит:

PHP:
Array
(
    [helenic] => Array
        (
            [new] => Array
                (
                    [15] => Super
                )
 
            [sprite] => Array
                (
                    [4] => Дизайн стенда Биогая
                    [5] => Дизайн стенда Хьюмер
                )
 
            [cocacola] => Array
                (
                    [1] => Имидж Biogaya ORS
                    [2] => Календарь «Картотека»
                    [3] => Буклет Биогая Продентис
                )
 
        )
 
    [abbott] => Array
        (
            [awa] => Array
                (
                    [6] => «За значительные успехи»
                )
 
        )
 
    [biola] => Array
        (
            [biola] => Array
                (
                    [7] => Разработка героя
                    [8] => Концепт стикера
                )
 
            [table] => Array
                (
                    [14] => Table
                )
 
        )
 
    [rus] => Array
        (
            [car] => Array
                (
                    [12] => Audi
                )
 
            [concept] => Array
                (
                    [11] => Concept car
                    [13] => Car concept
                )
 
            [rus] => Array
                (
                    [9] => Серия имиджей
                    [10] => Название работы
                )
 
        )
 
)
Мне нужно отсортировать все элементы в массиве вот так:

PHP:
Array
(
    [abbott] => Array
        (
            [awa] => Array
                (
                    [6] => «За значительные успехи»
                )
 
        )
 
    [rus] => Array
        (
            [rus] => Array
                (
                    [9] => Серия имиджей
                    [10] => Название работы
                )
 
            [car] => Array
                (
                    [12] => Audi
                )
 
            [concept] => Array
                (
                    [11] => Concept car
                    [13] => Car concept
                )
 
        )
 
    [biola] => Array
        (
            [biola] => Array
                (
                    [7] => Разработка героя
                    [8] => Концепт стикера
                )
 
            [table] => Array
                (
                    [14] => Table
                )
 
        )
 
    [helenic] => Array
        (
            [cocacola] => Array
                (
                    [1] => Имидж Biogaya ORS
                    [2] => Календарь «Картотека»
                    [3] => Буклет Биогая Продентис
                )
 
            [sprite] => Array
                (
                    [4] => Дизайн стенда Биогая
                    [5] => Дизайн стенда Хьюмер
                )
 
            [new] => Array
                (
                    [15] => Super
                )
 
        )
 
)
Можно ли так сделать стандартными функциями и если нельзя то всё же как это сделать?
Я 2-й день голову ломаю.
 

С.

Продвинутый новичок
Порярдок элементов в массиве никаким не "автоматическим", ни "ручным" способом не меняется. Если такое необходимо, то надо просто удалять элемент и пересоздаваткь его заново в другом месте массива.
 

panfilov

Новичок
Порярдок элементов в массиве никаким не "автоматическим", ни "ручным" способом не меняется. Если такое необходимо, то надо просто удалять элемент и пересоздаваткь его заново в другом месте массива.
а как же "unset(a[ b ]); a[ b ] = 111;" ?
 

panfilov

Новичок
Что это? Контраргумент в виде подтверждения моих слов?
нет, я же просто удаляю элемент в массиве a. Остальные элементы не трогаю, а потом заново создаю элемент и он по идее должен добавиться в конец массива.
Я думал сделать таким способом:
перед удалением элемента, копировать его в переменную, дальше удалять элемент, и создавать его заново приравнивая значение переменной.
PHP:
$temp = $a["b"];
unset($a["b"]);
$a["b"] = $temp;
 

Тугай

Новичок
Сразу никак наверно. Но кое что можно и сразу делать при заполнении - считать максимальный $id[$i] каждого client, ну скажем в массив $max_client_id[$client[$j]];
Теперь если отсортировать $max_client_id, то ключи клиенты станут в нужном порядке.

Аналогично нужно считать максимумы $id[$i] для брендов для каждого клинета, сюда например
$max_brand_id[$client[$j]][$brand[$i]];

Снова если отсортировать $max_brand_id[$client[$j]], то его ключи бренды станут как надо, отсалось собрать не забыв отсортировать сами $id[$i] внутри бренда.
 
Последнее редактирование:

Тугай

Новичок
С генерацией исходных данных у тебя там не ясно что написано, поэтому так
PHP:
<?php
$struct = array (
	'helenic' => array (
        	'new' => array(
			'15' => 'Super'
		),
		'sprite' => array(
			'4' => 'Дизайн стенда Биогая',
                    	'5' => 'Дизайн стенда Хьюмер'
		),
		'cocacola' => array (
                    '1' => 'Имидж Biogaya ORS',
                    '2' => 'Календарь «Картотека»',
                    '3' => 'Буклет Биогая Продентис'
                )
         ),
	'abbott' => array (
		'awa' => array (
			'6' => 'За значительные успехи'
		),
	),
 	'biola' => array (
		'biola' => array (
			'7' => 'Разработка героя',
			'8' => 'Концепт стикера'
                ),
		'table' => array (               
			'14' => 'Table'
                )
         ),
	'rus' => array (
		'car' => array (
			'12' => 'Audi'
		),
		'concept' => array (
			'11' => 'Concept car',
			'13' => 'Car concept'
                ),
		'rus' => array (
			'9' => 'Серия имиджей',
			'10' => 'Название работы'
                )
         )
);

$max_client_id = array();
$max_brand_id = array();
foreach ($struct as $client => $brands) {
	$max_client_id[$client] = 0;
	
	foreach ($brands as $brand => $items) {
		$max_brand_id[$client][$brand] = 0;
		foreach ($items as $id => $name) {
			if ($id > $max_client_id[$client]) {
				$max_client_id[$client] = $id;
			}
			if ($id > $max_brand_id[$client][$brand]) {
				$max_brand_id[$client][$brand] = $id;
			}
		}
	}
}

$s_struct = array();
asort($max_client_id);
foreach(array_keys($max_client_id) as $client) {
	$brands = $max_brand_id[$client];
	asort($brands);
	foreach (array_keys($brands) as $brand) {
		$s_struct[$client][$brand] = $struct[$client][$brand];
	}
}

print_r($struct);

print_r($s_struct);
 

С.

Продвинутый новичок
Эта фраза не была расчитана на слоупоков.
 
Сверху