Операции, задачи на массивы PHP

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

У массивов есть мощная функция по наполнению массива array_push(), которая добавляет один или несколько элементов в конец массива.

$stack = array(); // или $stack = [] с PHP 5.4;
array_push($stack, "apple", "banana");
print_r($stack); // Array ([0] => apple [1] => banana) 

Так как array_push() является функцией, то каждый раз ее необходимо вызывать, для наполнения массива, что оказывается ресурсозатратно если ее использовать например в циклах.

Для краткости записи и для экономии ресурсов ей соответствует инструкция:

$stack[] = "apple";
$stack[] = "banana";
print_r($stack); // Array ([0] => apple [1] => banana) 

Преимущество инструкции $stack[] = «apple» заключается в том, что при ее объявлении осуществляется создание массива на лету, то есть в нашем примере мы не объявляли пустой массив $stack = [], он создается самостоятельно, в то время как функция array_push($stack, «apple», «banana») требует, что бы был объевлен массив $stack иначе мы получим предупреждение.

Переопределение ключей массива.

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

В связи с этим сокращенной инструкцией $stack = [] необходимо пользоваться очень аккуратно, например если мы выполним:

$array['colour'] = 'blue';
$array['colour'][] = 'white';

print_r($array); // ошибка

возникнет ошибка, так как мы переопределяем строковое значение с одинаковым ключом colour, а так как значение blue является строкой, то мы не можем добавить в него значение white.

В данном случае правильной будет конструкция:

$array['colour'] = ['blue'];
$array['colour'][] = 'white';

print_r($array); // Array ( [colour] => Array ( [0] => blue [1] => white ) )

Переопределение значений массива

Еще одна интересная особенность массива — переопределение значений:

$array['coloring'] = 'blue';
$array['coloring'][0] = 'green';
print_r($array['coloring']); // glue

В данном примере мы присвоили ключу coloring массива строковое значение blue, и как известно строку можно разбить на символы, например нулевой элемент строки $str = ‘green’ можно записать $str[0], соответсвенно $array[‘coloring’][0] это равносильно $str[0] = ‘blue’, тоесть символ b, который мы переопределяем символом g из строки green.

Итак, мы подошли к практическому применению операции с масивами и переопределения ключей.

Задание 1.

Дан двумерный массив

$arr = [
        ['id' => '148664', 'date' => '2020-09-08'],
        ['id' => '148659', 'date' => '2020-09-09'],
        ['id' => '148786', 'date' => '2020-09-10'],
        ['id' => '148866', 'date' => '2020-09-10']
    ];

нам необходимо его отсортировать по дате, что бы он приобрел следующий вид, то есть убрать дубли дат:

Array
(
    [2020-09-08] => Array
        (
            [0] => Array
                (
                    [house_id] => 148664
                    [date] => 2020-09-08
                )

        )

    [2020-09-09] => Array
        (
            [0] => Array
                (
                    [house_id] => 148659
                    [date] => 2020-09-09
                )

        )

    [2020-09-10] => Array
        (
            [0] => Array
                (
                    [house_id] => 148786
                    [date] => 2020-09-10
                )

            [1] => Array
                (
                    [house_id] => 148866
                    [date] => 2020-09-10
                )

        )

)

Для этого мы выполняем простую операцию:

$result = [];
    foreach($arr as $key => $val) {
        $result[$val['date']][] = array(
            'house_id' => $val['id'],
            'date' => $val['date']
        );
    }
echo "<pre>";
print_r($result);
echo "</pre>";

Задание 2.

Дан многомерный массив:

$array = [
	['pay_date' => '2020-06-18 12:56:24', 'amount' => 8.66667, 'comment' => 'Плата за послугу'], 
	['pay_date' => '2020-06-18 12:56:14', 'amount' => -4.33333, 'comment' => 'Плата за послугу'],
	['pay_date' => '2020-06-01 01:10:01', 'amount' => -10, 'comment' => 'Плата за послугу'],
	['pay_date' => '2020-05-06 10:12:39', 'amount' => 8.3871, 'comment' => 'Плата за послугу'],
	['pay_date' => '2020-07-05 01:29:02', 'amount' => -29, 'comment' => 'Плата за товар'],
	['pay_date' => '2020-05-05 12:17:01', 'amount' => -8.70968, 'comment' => 'Плата за послугу']
];

нам необходимо отсортировать его по дате в порядке возрастания. Итак приступим:

for ($i=0; $i < count($array); $i++) { 
    $sortkey[$i]=$array[$i]['pay_date'];
}

asort($sortkey);//по возрастанию, arsort($sortkey) - по убыванию

foreach ($sortkey as $key => $value) {
    $sorted[] = $array[$key];
}
print_r($sorted);

Также, мы можем отсортировать данный массив с помощью другой конструкции:

for($a = 0; $a < count($array); $a++) {
    for($b = 0; $b < count($array)-1; $b++){
        if($array[$b]['pay_date'] > $array[$b+1]['pay_date']) { 
            $temp = $array[$b+1];  
            $array[$b+1] = $array[$b]; 
            $array[$b] = $temp; 
        }       
    }
}

Задание 3.

В php есть встроенная функция array_count_values, которая подсчитывает количество всех значений массива. Но есть один нюанс, она учитывает регистр. Для регистро-независимой сортировки используем свое решение.

Дан массив:

$array = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');

отсортируем его независимо от регистра:

function array_icount_values($array) {
    $ret_array = array();
    foreach($array as $value) {
        foreach($ret_array as $key2 => $value2) {
            if(strtolower($key2) == strtolower($value)) {
                $ret_array[$key2]++;
                continue;
            }
        }
		
        $ret_array[$value] = 1;
		
    }
    return $ret_array;
}

Для сортировки массивов есть встроенная функция sort(), но мы можем отсортировать массив без неё:

$array = array(80, 90, 100, 10, 50, 3);

for($a = 0; $a < count($array); $a++) {
    for($b = 0; $b < count($array)-1; $b++){
        if($array[$b] > $array[$b+1]) { 
            $temp = $array[$b+1];  
            $array[$b+1] = $array[$b]; 
            $array[$b] = $temp; 
        }       
    }
}

Задание 4.

Дан многомерный массив:

$arr_pod_cat = [
	0 => [
		'name' => 'Подключение', // 1_1
		'id' => 1
	],
	1 => [
		'name' => 'Вне зоны', // 1_2
		'id' => 1
	],
	2 => [
		'name' => 'Вход в кабинет', // 1_3
		'id' => 1
	],
	3 => [
		'name' => 'Вход администратора', // 1_4
		'id' => 1
	],
	4 => [
		'name' => 'Техничный', // 2_1
		'id' => 2
	],
	5 => [
		'name' => 'Выезд специалиста', // 2_2
		'id' => 2
	],
	6 => [
		'name' => 'Финансовый', // 3_1
		'id' => 3
	],
	7 => [
		'name' => 'Задержка платежа', // 3_2
		'id' => 3
	],
	8 => [
		'name' => 'Благодарность', // 4_1
		'id' => 4
	],
	9 => [
		'name' => 'Предупреждение', // 4_2
		'id' => 4
	],
	10 => [
		'name' => 'Информация', // 4_3
		'id' => 4
	],
	11 => [
		'name' => 'Вопрос', // 4_4
		'id' => 4
	],
	12 => [
		'name' => 'Опрос', // 1_5
		'id' => 1
	],
	13 => [
		'name' => 'Прозвон', // 3_3
		'id' => 3
	],
	14 => [
		'name' => 'Напоминание', // 1_6
		'id' => 1
	],
	15 => [
		'name' => 'IPTV', // 2_3
		'id' => 2
	],
	16 => [
		'name' => 'Спамер', // 2_4
		'id' => 2
	],
	17 => [
		'name' => 'Розрыв договора', // 4_5
		'id' => 4
	],
	18 => [
		'name' => 'Авария', // 3_4
		'id' => 3
	],
	19 => [
		'name' => 'Подключение BT', // 1_7
		'id' => 1
	],
	20 => [
		'name' => 'Прозвон повторный', // 3_5
		'id' => 3
	],
	21 => [
		'name' => 'Перезвоните', // 4_6
		'id' => 4
	]
	
];

необходимо вывести ассоциативный массив, где ключами будет конструкция с нижним подчеркиванием, например значение ‘Подключение’ будет иметь ключ 1_1, потому что является 1-й подкатегорией и является 1-я по счету, а ‘Задержка платежа’ — 3_2, так как является 3-й подкатегорией и является 2-я по счету.

Для этого отсортируем данный массив в порядке возрастания:

for($a = 0; $a < count($arr_pod_cat); $a++) {
    for($b = 0; $b < count($arr_pod_cat)-1; $b++){
        if($arr_pod_cat[$b]['id'] > $arr_pod_cat[$b+1]['id']) { 
            $temp = $arr_pod_cat[$b+1];  
            $arr_pod_cat[$b+1] = $arr_pod_cat[$b]; 
            $arr_pod_cat[$b] = $temp; 
        }       
    }
}

а дальше проведем непосредственно сортировку по ключам:

$arr = [];
$k = 1;
$t = 1;
for ($i = 0; $i < count($arr_pod_cat); $i++) {
	if ($arr_pod_cat[$i]['id'] == $k) {
		$arr[$k.'_'. $t] = $arr_pod_cat[$i]['name'];
		$t++;
	} else {
		$k++;
		$t = 1;
		$arr[$k.'_'. $t] = $arr_pod_cat[$i]['name'];
		$t++;
	}
}
print_r($arr);

Задание 5.

Заполнить массив длины 10 нулями и единицами, при этом данные значения чередуются, начиная с нуля.

$arr = [];
for ($i = 0; $i <= 10; $i++) {
	if ($i % 2 == 0) {
		$arr[$i] = '0';
	} else {
		$arr[$i] = '1';
	}
}
print_r($arr);

Задание 6.

Найдите сумму элементов массива. Реализовать без помощи стандартных функций.

$arr = [1, 2, 4, 6, 3];
$sum = 0;
for ($i = 0; $i < count($arr); $i++) {
	$sum += $arr[$i];
}
print_r($sum);
Категории PHP

Добавить комментарий