• Чем дополнить элементарную функцию, чтоб вышло как на картинке (см. под кат)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Например, так:
    function makeUrl(&$arr, $name) {
      if (!isset($arr[$name]['url'])) {
        if ('' == $arr[$name]['parent']) {
          $arr[$name]['url'] = $arr[$name]['alias'];
        } else {
          $arr[$name]['url'] = makeUrl($arr, $arr[$name]['parent']) . '/' .  $arr[$name]['alias'];
        }
      }
      return $arr[$name]['url'];
    }
    
    foreach (array_keys($arr) as $name) {
      makeUrl($arr, $name);
    }
    Ответ написан
    1 комментарий
  • Как записать ключи массива в строку?

    @LazyDev
    Если примитивно и не вникать в детали:

    <?php
    
    $arr = ['Массив' =>
      [
        'purchases' => 'Покупки',
        'food' 	=> 'Еда',
        'vegetables' => 'Овощи',
        'carrot' 	=> 'Морковка',
      ]
    ];
    
    
    $newArr = [];
    $prevUri = "";
    foreach ( $arr['Массив'] as $key => $name ) {
    	$uri = $prevUri ? "{$prevUri}/{$key}" : $key;
    	$newArr['Массив'][$key] = [
    		'name' => $name,
    		'uri' => $uri,
    	];
    	$prevUri = $uri;
    }
    
    print_r($newArr);


    Результат:
    Array
    (
        [Массив] => Array
            (
                [purchases] => Array
                    (
                        [name] => Покупки
                        [uri] => purchases
                    )
    
                [food] => Array
                    (
                        [name] => Еда
                        [uri] => purchases/food
                    )
    
                [vegetables] => Array
                    (
                        [name] => Овощи
                        [uri] => purchases/food/vegetables
                    )
    
                [carrot] => Array
                    (
                        [name] => Морковка
                        [uri] => purchases/food/vegetables/carrot
                    )
    
            )
    
    )
    Ответ написан
    1 комментарий
  • PHP Как преобразовать функцию рекурсии?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Как должна выглядеть функция, чтоб рекурсия происходила внутри функции, а не на саму функцию.

    Рекурсия - это и есть вызов функции из нее же. Вы, конечно, можете создать функцию, которая будет вызывать рекурсивную функцию, но тогда функция с рекурсией никуда не денется.
    С другой стороны, любую функцию можно переписать без использования рекурсии.
    Например так:
    function parents($tree, $childKey) {
        $parents = [];     
        $endOfTree = false;
        $minLevel = 1;
        $currentLevel = 1;
        $parentBranches = [];
        $branch = $tree;
        $branchKey = key($branch);
        $branchValue = current($branch);
        
        while (!$endOfTree) {      
            // Обработка текущего элемента
            if (strpos($childKey, $branchKey . ".") === 0 && $branchKey !== $childKey) {
                $parents[] = (string)$branchKey;
            }
            
            // Переключение ветки на внутренни уровень, если он есть
            if (is_array($branchValue) && !empty($branchValue)) {
                $currentLevel++;
                $parentBranches[] = $branch;
                $branch = $branchValue;                        
                $branchKey = key($branch);
                $branchValue = current($branchValue);
                continue;
            } 
    
            //  Переключение на следующий элемент
            $branchValue = next($branch);
            $branchKey = key($branch);
            
            // В случае, если следующего элемента нет, возврат на уровень выше или завершение цикла
            if ($branchValue === false) { 
                $branch = array_pop($parentBranches);
                $currentLevel--;
                
                // Возврат на уровень выше, если это возможно
                if ($currentLevel >= $minLevel) {
                    $branchValue = next($branch);      
                    $branchKey = key($branch);    
                // Завершение цикла, если уровень минимальный
                } else {
                    $endOfTree = true;
                }
            }
        }
        
        // Смена направления массива и возвращение результата
        return array_reverse($parents);
    }
    
    
    
    // Проверка
    parents($tree, '1.3.2.2'); 
    /*
    array(3) {
      [0]=>
      string(5) "1.3.2"
      [1]=>
      string(3) "1.3"
      [2]=>
      string(1) "1"
    }
    */
    Ответ написан
    2 комментария