PHP ассоциативный многомерный массив - получить значения между ключами массива - PullRequest
0 голосов
/ 05 мая 2020

У меня есть многомерный ассоциативный массив php, который выглядит так:

$transportation_options = Array
  (
  [0] => Array("label" => "Car", "group" => "start"),
  [1]=> Array("label" => "Volvo", "group" => Null),
  [2]=> Array("label" => "BMW", "group" => Null),
  [3]=> Array("label" => "Saab", "group" => Null),
  [4]=> Array("label" => "Land Roover", "group" => Null),
  [5]=> Array("label" => "Car", "group" => "end"),
  [6]=> Array("label" => "Air Plane", "group" => NULL)
  [7]=> Array("label" => "Boat", "group" => "start"),
  [8]=> Array("label" => "Ship", "group" => Null),
  [9]=> Array("label" => "Yacht", "group" => Null),
  [10]=> Array("label" => "Sail Boat", "group" => Null),
  [11]=> Array("label" => "Boat", "group" => "end"),
  [12]=> Array("label" => "Bicycle", "group" => NULL)
);

Как этот массив можно превратить в этот массив

$transportation_options_rewrite = array
  (
  array("Car" => array(Volvo,BMW,Saab,Land Roover)),
  array("Air Plane")
  array("Boat" => array(Ship,Yacht,Sail Boat)),
  array("Bicycle")
);

Чтобы я (каким-то образом ) можно сравнить

$transportation_selected = array(Saab,Volvo,Ship,Bicycle,Yacht);

с $ transport_options_rewrite и в конечном итоге получить следующий результат:

Bicycle
Boat: Ship, Yacht
Car: Saab, Volvo

На этом этапе я застрял при перезаписи массива, пытаюсь следовать это пример. Но это не работает из-за многомерного массива.

$start = "start";
$end ="end";
$new_array = [];
$i=0;$go=false;
foreach ($transportation_options_rewrite as $element) {
    if($go){
        $new_array[$i] = $element; 
        $i++;
    }
    if($element==$start){
        $go = true;
    }
    if($element==$end){
        $go = false;
    }
}
$total_elems_new = count($new_array);
unset($new_array[$total_elems_new-1]);
print_r($new_array);

1 Ответ

1 голос
/ 05 мая 2020

Суть здесь в том, что мы либо «в группе», либо «НЕ в группе». Если мы не в группе, то новое значение ЯВЛЯЕТСЯ группой, и тогда мы В этой группе. Если мы находимся в группе, то новое значение переходит в группу, в которой мы находимся.
Если мы завершаем группу, то к выходным данным ничего не добавляется

Это обеспечивает результат, который вы описали :


$options = array
  (
  array("label" => "Car", "group" => "start"),
  array("label" => "Volvo", "group" => Null),
  array("label" => "BMW", "group" => Null),
  array("label" => "Saab", "group" => Null),
  array("label" => "Land Roover", "group" => Null),
  array("label" => "Car", "group" => "end"),
  array("label" => "Air Plane", "group" => NULL),
  array("label" => "Boat", "group" => "start"),
  array("label" => "Ship", "group" => Null),
  array("label" => "Yacht", "group" => Null),
  array("label" => "Sail Boat", "group" => Null),
  array("label" => "Boat", "group" => "end"),
  array("label" => "Bicycle", "group" => NULL)
);
$sorted = [];
$in = NULL;
foreach($options as $index=>$row){
    // for version 2, uncomment the next line if ($in==null)$sorted...
    // if ($in==null)$sorted[$row['label']] = [];
    if ($row['group']=='start'){
        $in = $row['label'];
        continue;
    }
    if ($row['group']=='end'){
        $in = null;
        continue;
    }
    // For version 2, comment the next line if($in==null)
    if ($in==null)$sorted[] = $row['label'];
    if ($in!==null)$sorted[$in][] = $row['label'];
}

print_r($sorted);

Я также помещаю код для вывода в немного другом формате, где каждая группа является ключом массива, а каждая группа имеет массив (хотя Air Plain и Bicycle являются пустыми массивами). Для этого просто прокомментируйте / раскомментируйте строки, указанные в коде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...