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

Отладка баз данных SQLite на Android

При написании приложений под операционную систему Android, приходится часто использовать базы данных для хранения данных. Я уже показывал шаблон, для создания БД на телефоне, сейчас хочу рассказать про отладку баз данных SQLite в случае работы с Android.

В составе Android SDK есть инструмент, который называется ADB или Android Debug Bridge. Командная строка позволяет связываться с запущенным эмулятором или физическим устройством, на котором ведется отладка.

Continue reading

VBA: Найти сумму и количество тех элементов массива, которые делятся на 5 и на 8 одновременно. Полученные значения вывести в одно окно сообщения

Задача:

Дан динамический массив В(n), заполненный случайными числами с помощью генератора случайных чисел (элементы массива вывести в ячейки рабочего листа).  Найти сумму и количество тех элементов массива, которые делятся на 5 и на 8 одновременно. Полученные значения вывести в одно окно сообщения.

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Sub prog()
    Dim i As Integer
    Dim sum As Integer
    Dim count As Integer
    sum = 0
    count = 0
    n = InputBox("n=") ' Просим ввести n - размерность массива.
    ReDim B(n)
    Cells.Value = ""
    Cells.Interior.ColorIndex = -4142
    For i = 1 To n
        B(i) = Int((0 - 100 + 1) * Rnd + 100)
        If ((B(i) Mod 5 = 0) And (B(i) Mod 8 = 0)) Then
            sum = sum + B(i)
            count = count + 1
            Cells(1, i).Interior.Color = vbGreen
        End If
        Cells(1, i).Value = B(i) ' Печать в ячейку
    Next i
    MsgBox ("Сумма = " + CStr(sum) + " Количество = " + CStr(count))
End Sub
Public Sub prog()
    Dim i As Integer
    Dim sum As Integer
    Dim count As Integer
    sum = 0
    count = 0
    n = InputBox("n=") ' Просим ввести n - размерность массива.
    ReDim B(n)
    Cells.Value = ""
    Cells.Interior.ColorIndex = -4142
    For i = 1 To n
        B(i) = Int((0 - 100 + 1) * Rnd + 100)
        If ((B(i) Mod 5 = 0) And (B(i) Mod 8 = 0)) Then
            sum = sum + B(i)
            count = count + 1
            Cells(1, i).Interior.Color = vbGreen
        End If
        Cells(1, i).Value = B(i) ' Печать в ячейку
    Next i
    MsgBox ("Сумма = " + CStr(sum) + " Количество = " + CStr(count))
End Sub

Continue reading

VBA: Найти сумму и количество элементов массива, остаток от деления которых на 2 равен 3

Глупая задача…

Дан динамический массив А(n), заполненный случайными числами с помощью генератора случайных чисел (элементы массива вывести в ячейки рабочего листа). Найти сумму и количество элементов массива, остаток от деления которых на 2 равен 3. Полученные значения вывести в одно окно сообщения.

Ни одно число не будет подходить под условие задачи, но решение есть.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Sub sum1()
    Dim i As Integer
    Dim sum As Integer
    Dim count As Integer
    sum = 0
    count = 0
    n = InputBox("n=") ' Просим ввести n - размерность массива.
    ReDim arr(n)
    Cells.Value = ""
    Cells.Interior.ColorIndex = -4142
    For i = 1 To n
        arr(i) = Int((0 - 100 + 1) * Rnd + 100)
        If (arr(i) Mod 2 = 0) Then
            sum = sum + arr(i)
            count = count + 1
            Cells(1, i).Interior.Color = vbGreen
        End If
        Cells(1, i).Value = arr(i) ' Печать в ячейку
    Next i
    MsgBox ("Сумма = " + CStr(sum) + " Количество = " + CStr(count))
End Sub
Public Sub sum1()
    Dim i As Integer
    Dim sum As Integer
    Dim count As Integer
    sum = 0
    count = 0
    n = InputBox("n=") ' Просим ввести n - размерность массива.
    ReDim arr(n)
    Cells.Value = ""
    Cells.Interior.ColorIndex = -4142
    For i = 1 To n
        arr(i) = Int((0 - 100 + 1) * Rnd + 100)
        If (arr(i) Mod 2 = 0) Then
            sum = sum + arr(i)
            count = count + 1
            Cells(1, i).Interior.Color = vbGreen
        End If
        Cells(1, i).Value = arr(i) ' Печать в ячейку
    Next i
    MsgBox ("Сумма = " + CStr(sum) + " Количество = " + CStr(count))
End Sub

Файл Excel с этим кодом

Про погоду и массивы

Такая школьная простенькая задачка…
Условие:

Пусть в массиве из 12 компонент хранится количество осадков в каждом месяце. Требуется напечатать таблицу из трех столбцов, где для каждого месяца вывести его номер, количество осадков в нем,  отклонение количества осадков в этом месяце от средне годового.

Continue reading

Bash: Среднее арифметическое.

Нужно посчитать среднее арифметическое, написав скрипт на Bash.

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

1
2
3
4
5
6
7
8
#! /bin/sh
i=0
sum=0
for an_arg in "$@" ; do
  sum=$(($sum + ${an_arg}))
  i=$(($i+1))
done
expr $sum / $i
#! /bin/sh
i=0
sum=0
for an_arg in "$@" ; do
  sum=$(($sum + ${an_arg}))
  i=$(($i+1))
done
expr $sum / $i

Пример тестового запуска:

1
sh avg.sh 1 2 3 4 5
sh avg.sh 1 2 3 4 5

Java: Доступ к членам класса

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

 Описание класса Private Без модификатора Protected Public
 Один и тот же класс  Да  Да  Да  Да
 Подкласс класса этого же пакета  Нет  Да  Да  Да
 Класс этого же пакета не являющийся подклассом  Нет  Да  Да  Да
 Подкласс класса другого пакета  Нет  Нет  Да  Да
 Класс другого пакета, не являющийся подклассом класса данного пакета  Нет  Нет  Нет  Да

 

BASH: Простой калькулятор

Простой калькулятор на Bash. Вводится 2 числа с клавиатуры, действие и производится вычисление при помощи функции expr().

Есть проверка на недопустимость деления на 0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
echo "enter first value:"
read x
echo "enter second value"
read y
echo "enter action symbol"
read act
 
case $act in
"+") echo " $x + $y ="  $(expr $y + $x);;
"-") echo "$x - $y ="   $(expr $x - $y);;
"/") if [ $y -eq 0 ]; then
       echo "error: delimiter by zero";
     else
       echo " $x / $y =" $(expr  $x / $y);
     fi;;
"*") echo " $x * $y =" $(expr  $x \* $y);;
*) echo "command is unknown!"
esac
echo "enter first value:"
read x
echo "enter second value"
read y
echo "enter action symbol"
read act

case $act in
"+") echo " $x + $y ="  $(expr $y + $x);;
"-") echo "$x - $y ="   $(expr $x - $y);;
"/") if [ $y -eq 0 ]; then
       echo "error: delimiter by zero";
     else
       echo " $x / $y =" $(expr  $x / $y);
     fi;;
"*") echo " $x * $y =" $(expr  $x \* $y);;
*) echo "command is unknown!"
esac

C, Unix, OPEN(),CLOSE(),READ(), WRITE(): Копирование файлов

Начался новый предмет, новые лабы.

Задачка примерно такая: Есть *nix-операционная система. В ней написать приложение на C, которое умеет копировать файлы при помощи системных вызовов Open(), Close(), Read(), Write();

В моем случае в качестве операционной системы использую Ubuntu 12.04

Continue reading

JAVA: Треугольник паскаля

Давненько не было школьных\вузовских задачек из классики.

Треугольник паскаля на JAVA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Scanner;
 
 
public class PascalTriangle {
 
    public static void main(String[] args) {
        
        int LINES = 0;
        System.out.println("Enter number of lines for Pascal Triangle:");
        // Reading
        Scanner reader = new Scanner(System.in);
        LINES = reader.nextInt();
        reader.close();
        // Calculation and print
        int [][] p = new int [LINES][];
        p[0] = new int [1];
        p[1] = new int [2];
        p[1][0] = p[1][1] = 1;
        System.out.println(p[0][0] = 1);
        System.out.println(p[1][0] + " " + p[1][1]);
        for (int i = 2; i < LINES; i++)
        {
            p[i] = new int [i+1];
            System.out.print((p[i][0] = 1) + " ");
            for (int j = 1; j < i; j++)
            {
                System.out.print((p[i][j] = p[i-1][j-1] + p[i-1][j]) + " ");
            }
            System.out.println(p[i][i]=1);
        }
    }
 
}
import java.util.Scanner;


public class PascalTriangle {

    public static void main(String[] args) {
        
        int LINES = 0;
        System.out.println("Enter number of lines for Pascal Triangle:");
        // Reading
        Scanner reader = new Scanner(System.in);
        LINES = reader.nextInt();
        reader.close();
        // Calculation and print
        int [][] p = new int [LINES][];
        p[0] = new int [1];
        p[1] = new int [2];
        p[1][0] = p[1][1] = 1;
        System.out.println(p[0][0] = 1);
        System.out.println(p[1][0] + " " + p[1][1]);
        for (int i = 2; i < LINES; i++)
        {
            p[i] = new int [i+1];
            System.out.print((p[i][0] = 1) + " ");
            for (int j = 1; j < i; j++)
            {
                System.out.print((p[i][j] = p[i-1][j-1] + p[i-1][j]) + " ");
            }
            System.out.println(p[i][i]=1);
        }
    }

}
Вывод

Вывод программы