Flat array to nested in php

Requirements = PHP 5.3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function buildTree($flat, $pidKey, $idKey = null)
        {
            $grouped = array();
            foreach ($flat as $sub){
                $grouped[$sub[$pidKey]][] = $sub;
            }
 
            $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey) {
                foreach ($siblings as $k => $sibling) {
                    $id = $sibling[$idKey];
                    if(isset($grouped[$id])) {
                        $sibling['children'] = $fnBuilder($grouped[$id]);
                    }
                    $siblings[$k] = $sibling;
                }
 
                return $siblings;
            };
 
            $tree = $fnBuilder($grouped[0]);
 
            return $tree;
        }
function buildTree($flat, $pidKey, $idKey = null)
        {
            $grouped = array();
            foreach ($flat as $sub){
                $grouped[$sub[$pidKey]][] = $sub;
            }

            $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey) {
                foreach ($siblings as $k => $sibling) {
                    $id = $sibling[$idKey];
                    if(isset($grouped[$id])) {
                        $sibling['children'] = $fnBuilder($grouped[$id]);
                    }
                    $siblings[$k] = $sibling;
                }

                return $siblings;
            };

            $tree = $fnBuilder($grouped[0]);

            return $tree;
        }

Usage:

1
2
3
4
5
6
7
8
9
$flat = array(
    array('id'=>100, 'parentID'=>0, 'name'=>'a'),
    array('id'=>101, 'parentID'=>100, 'name'=>'a'),
    array('id'=>102, 'parentID'=>101, 'name'=>'a'),
    array('id'=>103, 'parentID'=>101, 'name'=>'a'),
);
 
$tree = buildTree($flat, 'parentID', 'id');
print_r($tree);
$flat = array(
    array('id'=>100, 'parentID'=>0, 'name'=>'a'),
    array('id'=>101, 'parentID'=>100, 'name'=>'a'),
    array('id'=>102, 'parentID'=>101, 'name'=>'a'),
    array('id'=>103, 'parentID'=>101, 'name'=>'a'),
);

$tree = buildTree($flat, 'parentID', 'id');
print_r($tree);

Thanks! http://stackoverflow.com/a/27360654/1886270

C#: Метод Симпсона. Нахождение интеграла.

Случилось интересное. Некоторое время назад я разместил код метода Симпсона на pascal. После его индексации на него стало приходить большое количество поисковых запросов (до 30% от всех за сутки), и я решил написать этот метод на основных языках. Пусть первым будет C#.

В коде объявлена дополнительная функция double Y(double p) Возвращает значение функции в данной точке. Т.е при решении ваших задач достаточно просто изменить формулу внутри этой функции.

Continue reading

C++: Вес Хэмминга с использованием atoi, itoa. Не рекурсия

Штука то интересная. Вес Хэмминга это количество единиц в числе, если его перевести в двоичную систему. Реализовать можно разными способами. Например так:

Continue reading

Pascal: Вычисление интеграла методом Симпсона

Для того, что бы понять, как это работает нужно обратиться к геометрическому смыслу интеграла.

Интеграл численно равен площади криволинейной трапеции, ограниченной кривой y(x), прямыми x=a, x=b и отрезком [a; b] оси Ox.

Формула Симпсона:

Continue reading

С++: Шифр Цезаря

Наверное, самый известный из «школьных» шифров. Практической ценности не имеет совершенно, кроме того,чтобы показать, что такое криптография в самом простом её проявлении.

Суть алгоритма, заключается в том, что для шифрования строки текста нужно сместить буквы на n-позиций. Например, это значит:

abc -> cdf при смещении на 3 символа — ну и так далее. Шифр не имеет практического смысла, так как легко подбирается перебором (26 вариантов для английского языка, что крайне мало)

Continue reading

C#: Простые числа методом Решета Эратосфена

Недавно писал уже о нахождении простых чисел методом перебора. Метод конечно работает, но у него есть одна проблема — медленный он.Чуть более быстрый метод — это решето Эратосфена.

Описание алгоритма из Википедии:

Для нахождения всех простых чисел не больше заданного числа n, следуя методу Эратосфена, нужно выполнить следующие шаги:

  1. Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
  2. Пусть переменная p изначально равна двум — первому простому числу.
  3. Считая от p шагами по p, зачеркнуть в списке все числа от 2p до n кратные p (то есть числа 2p, 3p, 4p, …)
  4. Найти первое не зачеркнутое число, большее чем p, и присвоить значению переменной p это число.
  5. Повторять шаги 3 и 4 до тех пор, пока p не станет больше, чем n

Continue reading

C#: Простые числа методом перебора

Простые числа. Иногда появляется необходимость определить простое ли число или нет.

Если взять теорию, то простое число-это такое число, которое делится только на себя и на единицу.

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

Continue reading

Калькулятор для перевода из одной системы счисления в другую на си

Удалось откопать и самую-самую суровую программу времен колледжа.

Была лабораторная с заданием: Написать калькулятор для перевода из одной системы счисления в другую. При этом системы счисления могут быть от 2 до 16 -ричных.

Проект в Visual Studio 2010 можно скачать здесь, а только исполняемый файл тут

UPD: Версия на Pascal тут

Continue reading