Разобрать массив и собрать его новый

346
20 сентября 2017, 13:24
$link_add = array(

    389=>array(
        1649=>array(
            "link"=>"1-komnatnye",
            "name"=>"1-комнатные",
            "n_prop"=>"43",
            "priority"=>"1",
        ),
        1650=>array(
            "link"=>"2-komnatnye",
            "name"=>"2-комнатные",
            "n_prop"=>"43",
            "priority"=>"1",
        ),
        1647=>array(
            "link"=>"vtorichka",
            "name"=>"Вторичка",
            "n_prop"=>"42",
            "priority"=>"2",
        ),
    )
);

Здравствуйте. Мне нужно сгруппировать значения массива в зависимости от приоритета . Например, в данном случае я должен получить 4 ссылки, которые собираются в след. массив:

array(
    "/1-komnatnye/",
    "/2-komnatnye/",
    "/1-komnatnye/vtorichka/",
    "/2-komnatnye/vtorichka/",
)

Возможно можно изначально исходны массив как-то переделать, чтобы потом группировать было удобнее? Спасибо за идеи !

Answer 1

Из вашего описания не ясно каков вообще алгоритм построения этих ссылок. Возможно все комбинации составить следует.

Допустим ваши исходные данные таковы:

$links = [
    [ "priority" => 1, "link" => "1-komnatnye" ],
    [ "priority" => 1, "link" => "2-komnatnye" ],
    [ "priority" => 2, "link" => "vtorichka" ],
    [ 'priority' => 2, 'link' => "qwe" ],
    [ 'priority' => 3, 'link' => 'zxc' ]
];

рекурсивное решение для генерации может быть таким:

function doSomething($data, &$result, $level = 1){
   static $path = [];
   $ldata = array_filter($data, function($e) use ($level){ return $e['priority'] == $level;});
   foreach($ldata as $ld){
       $path[] = $ld['link'];
       $result[] = implode('/', $path);
       doSomething($data, $result, $level + 1);
       array_pop($path);
   }
}
$result = [];
doSomething($links, $result);
print_r($result);

Фильтруем каждый раз только элементы нужного уровня. Циклом по ним запускаем рекурсию, при этом храня текущий путь в статической переменной. Перед вызовом рекурсии формируем ссылку по текущему пути.

на выходе:

Array (
  [0] => 1-komnatnye
  [1] => 1-komnatnye/vtorichka
  [2] => 1-komnatnye/vtorichka/zxc
  [3] => 1-komnatnye/qwe
  [4] => 1-komnatnye/qwe/zxc
  [5] => 2-komnatnye
  [6] => 2-komnatnye/vtorichka
  [7] => 2-komnatnye/vtorichka/zxc
  [8] => 2-komnatnye/qwe
  [9] => 2-komnatnye/qwe/zxc
)
READ ALSO
Как начать выборку столбцов “с и по” в MySQL

Как начать выборку столбцов “с и по” в MySQL

Есть таблица, которая хранит 140 примерно значений:

278
PHP - Бинарное изображение

PHP - Бинарное изображение

Нужно написать конвертор изображения в бинарный код и обратноВики

218