От работы дохнут кони. Ну, а я — бессмертный пони.
Контакты
Местоположение
Канада, Quebec, Montreal

Достижения

Все достижения (18)

Наибольший вклад в теги

Все теги (161)

Лучшие ответы пользователя

Все ответы (716)
  • 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 комментария
  • Как извлечь статистику количества неактивных пользователей по интервалам времени?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
         SUM(CASE WHEN `last_sign_in_at` <= DATE_SUB(NOW(), INTERVAL 3 DAY) THEN 1 ELSE 0 END) AS '> 3 days',
         SUM(CASE WHEN `last_sign_in_at` <= DATE_SUB(NOW(), INTERVAL 90 MINUTE) AND `last_sign_in_at` >= DATE_SUB(NOW(), INTERVAL 3 DAY) THEN 1 ELSE 0 END) AS '> 90 min',
         SUM(CASE WHEN `last_sign_in_at` <= DATE_SUB(NOW(), INTERVAL 30 MINUTE) AND `last_sign_in_at` >= DATE_SUB(NOW(), INTERVAL 90 MINUTE) THEN 1 ELSE 0 END) AS '> 30 min'
    FROM `table`
    Ответ написан
    1 комментарий
  • MySQL Как правильно выбрать из базы строки с вхождением?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT *
    FROM `table` 
    WHERE 1
    	AND FIND_IN_SET('1', `field`) > 0
    	AND FIND_IN_SET('2', `field`) = 0


    Альтернативный вариант:
    SELECT *
    FROM `table` 
    WHERE (
        (`field` LIKE '1,%' OR `field` LIKE '%,1,%' OR `field` LIKE '%,1') AND
        (`field` NOT LIKE '2,%' AND `field` NOT LIKE '%,2,%' AND `field` NOT LIKE '%,2') 
    )
    Ответ написан
    Комментировать
  • Как из одного массива записать в другой массив?

    Immortal_pony
    @Immortal_pony
    function groupBy(array $elements, callable $getUniqueKey) {
        $grouped = [];
        
        foreach ($elements as $element) {
            $uniqueKey = $getUniqueKey($element);
            $grouped[$uniqueKey][] = $element;
        }
        
        return $grouped;
    }
    
    $groupedByDate = groupBy($app, function($event) {
        return date("Y-m-d", strtotime($event['created_at']));
    });


    Пример
    Ответ написан
    1 комментарий