Операции с массивами имеют огромное значение в любом языке программирования. С помощью массивов и циклов можно осуществлять различные полезнейшие операции. Например, нам необходимо осуществить выборку по массиву или сортировку для вывода необходимых данных и многое другое.
У массивов есть мощная функция по наполнению массива 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 2; } } $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-я по счету.
Для этого отсортируем данный массив по ключу 'id' в порядке возрастания:
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);
Задание 7. Сортировка многомерного массива по ключу с убиранием дублей
$details = [ ["id"=>"2", "name"=>"Mike", "num"=>"9876543210"], ["id"=>"2", "name"=>"Carissa", "num"=>"08548596258"], ["id"=>"1", "name"=>"Mathew", "num"=>"784581254"], ]; unction unique_multidim_array($array, $key) { $temp_array = array(); $i = 0; $key_array = array(); foreach($array as $val) { if (!in_array($val[$key], $key_array)) { $key_array[$i] = $val[$key]; $temp_array[$i] = $val; } $i++; } return $temp_array; } print_r(unique_multidim_array($details, 'id'));