Я пытаюсь преобразовать этот массив

array(3) {
  ["Men"]=>
  array(2) {
    ["Sport shoes"]=>
    array(1) {
      ["Football shoes"]=>
      array(0) {
      }
    }
    ["Winter shoes"]=>
    array(0) {
    }
  }
  ["Women"]=>
  array(0) {
  }
  ["Childrens"]=>
  array(0) {
  }
}

К этому результату

Men
Men -> Sport shoes 
Men -> Sport Shoes -> Football shoes 
Men -> Winter shoes 
Women 
Childrens

Я пробовал много методов, но безуспешно. Может кто подскажет как это сделать.

Спасибо.

-1
PYovchevski 17 Сен 2018 в 22:49

2 ответа

Лучший ответ

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

Начиная с пустой строки, выполните итерацию по массиву и добавьте каждый ключ к результату. Перед переходом к следующей итерации, если значение не пусто, добавьте результат рекурсивного вызова. Когда вы дойдете до конца, у вас должна быть строка, представляющая всю структуру.

function get_map(array $array, string $path = ''): string
{
    $result = '';
    foreach ($array as $key => $value) {
        $result .= "$path$key\n" . ($value ? get_map($value, "$path$key->") : '');
    }
    return $result;
}
echo get_map($array);
1
Don't Panic 17 Сен 2018 в 21:25

Это можно сделать с помощью простой рекурсивной функции, например:

function printArray($array, $path = []) {
    if (!is_array($array) || count($array) < 1) {
        return;
    }
    foreach ($array as $k => $v) {
        if (count($path) > 0) {
            echo implode(' -> ', $path) . ' -> ';
        }
        echo $k . PHP_EOL;
        printArray($v, array_merge($path, [$k]));
    }
}

Live демо

2
brevis 17 Сен 2018 в 20:33