16) Дополнение чисел нулями в соответствии с порядком или "разбиение числа на 10-ки, 100-и и т.д." Пример с array_walk() для простой строки, типа "{не_цифры}*{цифры}*": PHP: $str = 'Г389'; $array = preg_split('/(?=\d)/u', $str, null, PREG_SPLIT_NO_EMPTY); array_walk($array, function(&$v, $k, $i) { if(is_numeric($v)) $v = str_pad($v, $i - $k, '0'); $i--; }, count($array)); var_dump($array); /* Результат: array(4) { [0]=> string(2) "Г" [1]=> string(3) "300" [2]=> string(2) "80" [3]=> string(1) "9" } */
17) Удалить идущие подряд элементы с одинаковыми значениями Сложный, но интересный вариант с функциями обработки массивов: PHP: $arr = array( '14:50' => 'Быстрые и громкие', '15:40' => 'Махинаторы', '16:05' => 'Махинаторы', '16:35' => 'Золотая лихорадка', '17:30' => 'Выжить любой ценой', '18:25' => 'Выжить любой ценой', '19:20' => 'Выжить любой ценой', '20:15' => 'Как это устроено?', '20:40' => 'Охотники за складами: Британия', '21:10' => 'Склады: битва в Канаде', '21:40' => 'Багажные войны', '22:05' => 'Махинаторы', '22:30' => 'Махинаторы', '23:00' => 'Как это устроено?', ); $new = array_filter( array_combine( array_keys($arr) + [-1=> false], // дополнить до размера второго параметра array_map( function($v1, $v2) { return ($v1 == $v2) ? false : $v1; }, $arr, [-1=> false] + $arr // сдвинуть на 1 ) ) ); echo 'Исходный массив: (size=' . count($arr) . ') '; print_r($arr); echo 'Полученный массив: (size=' . count($new) . ') ' ; print_r($new); Результат: Код (Text): Исходный массив: (size=14) Array ( [14:50] => Быстрые и громкие [15:40] => Махинаторы [16:05] => Махинаторы [16:35] => Золотая лихорадка [17:30] => Выжить любой ценой [18:25] => Выжить любой ценой [19:20] => Выжить любой ценой [20:15] => Как это устроено? [20:40] => Охотники за складами: Британия [21:10] => Склады: битва в Канаде [21:40] => Багажные войны [22:05] => Махинаторы [22:30] => Махинаторы [23:00] => Как это устроено? ) Полученный массив: (size=10) Array ( [14:50] => Быстрые и громкие [15:40] => Махинаторы [16:35] => Золотая лихорадка [17:30] => Выжить любой ценой [20:15] => Как это устроено? [20:40] => Охотники за складами: Британия [21:10] => Склады: битва в Канаде [21:40] => Багажные войны [22:05] => Махинаторы [23:00] => Как это устроено? ) * Задача и исходные данные из той темы .
18) Получить из первого массива определенные значения PHP: $array = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]; $search = ['a' => null, 'd' => null, 'e' => null, 'f' => 9]; print_r(array_replace($search, array_intersect_key($array, $search)));
19) 1. Составить массив, ключами в котором будут названия континентов (на английском - Africa), значениями — массивы из латинских названий зверей (например, Mammuthus columbi – можно найти в карточке статистики о животном справа). Найдите различных зверей и составьте массив так, чтобы для ключа Africa у вас значением был бы массив из зверей, там обитавших или обитающих. Выберите только один континент для каждого животного. Пусть у вас получится 10-15 зверей. 2.Теперь найдите всех зверей, название которых состоит из двух слов. Составьте из них новый массив. 3.Случайно перемешайте между собой первые и вторые слова названий животных так, чтобы на выходе мы получили выдуманных, фантазийных животных. Название фантазийного животного должно начинаться с первого слова реального названия животного. Важно, чтобы каждый кусочек был использован и не повторялся более одного раза. Ничего страшного, если в результате перемешивания иногда будут получаться реальные животные. Вывести этих животных на экран. PHP: <?php $continents = [ 'Africa' => [ 'African elephant', 'Hippo', 'Giraffe', 'Crocodile', 'Spotted hyena', 'Zebra', 'Chimpanzee', 'Python', 'Scorpio', 'Canna', ], 'Eurasia' => [ 'Tapir', 'Snow leopard', 'Varan', 'Big panda', 'Capercaillie', 'Pheasant', 'Mantis', 'Brown bear', 'Sable', 'Wolf' ] ]; $name_two_words = []; foreach($continents as $continent => $animals){ foreach($animals as $animal){ $all_animals= []; $anim = explode(' ', $animal); $all_animals[]=$anim; foreach($all_animals as $k){ if(count($k) === 2){ $comma_separated = implode(",", $k); $str = str_replace(',', ' ', $comma_separated); $name_two_words[]=$str; } } } } echo '<pre>'; var_dump($name_two_words); echo '<pre>'; foreach($name_two_words as $name){ $parts = explode(' ', $name); $first[] = $parts[0]; $second[] = $parts[1]; } /* echo '<pre>'; var_dump($first); var_dump($second); echo '<pre>'; */ $random_first_word = []; while (count($random_first_word) < count($name_two_words)){ $proverka = $first[rand(0, count($name_two_words)-1)]; if (!in_array($proverka, $random_first_word)) { array_push($random_first_word, $proverka); } } //var_dump($random_first_word); $random_second_word = []; while (count($random_second_word) < count($name_two_words)){ $proverka = $second[rand(0, count($name_two_words)-1)]; if (!in_array($proverka, $random_second_word)) { array_push($random_second_word, $proverka); } } //var_dump($random_second_word ); $final_result = []; for($i = 0; $i < count($name_two_words); $i++){ $final_result[]= $random_first_word[$i] . ' ' . $random_second_word[$i]; } var_dump($final_result); Результат, каждый раз будет другой До Код (Text): array(5) { [0]=> string(16) "African elephant" [1]=> string(13) "Spotted hyena" [2]=> string(12) "Snow leopard" [3]=> string(9) "Big panda" [4]=> string(10) "Brown bear" } После Код (Text): array(5) { [0]=> string(13) "African hyena" [1]=> string(8) "Big bear" [2]=> string(13) "Brown leopard" [3]=> string(16) "Spotted elephant" [4]=> string(10) "Snow panda" }
20) Получить список всех дубликатов значений массива Самый быстрый способ - использовать array_diff_key(). Но стоит помнить, что это требует много памяти. Пример: PHP: $array = [1, 10, 12, 2, 7, 3, 9, 4, 2, 7, 8, 5, 3, 7]; $duplicates = array_diff_key($array, array_flip(array_flip($array))); print_r($duplicates); /* Array ( [3] => 2 [4] => 7 [5] => 3 [9] => 7 ) */ п.с. Повод для алгоритма - эта тема. 21) Убрать дубликаты значений массива Самый быстрый способ - использовать array_intersect_key(). Но стоит помнить, что это требует много памяти. Пример: PHP: $array = [1, 10, 12, 2, 7, 3, 9, 4, 2, 7, 8, 5, 3, 7]; $duplicates = array_intersect_key($array, array_flip(array_flip($array))); print_r($duplicates); /* Array ( [0] => 1 [1] => 10 [2] => 12 [6] => 9 [7] => 4 [8] => 2 [10] => 8 [11] => 5 [12] => 3 [13] => 7 ) */
22) Дан массив с числами. Посчитайте суммарное количество цифр 3 в этих числах. PHP: $arr = [1, 55, 43, 88, 6, 5, 333, 912, 23, 9, 334, 83]; $arr2 = [3, 11, 13, 31, 28, 34]; function countEqualNum($massiv) { $newArr = []; $count = ''; foreach($massiv as $k ) { if(strpos($k, '3') !== false) { $newArr[] = $k; } } foreach($newArr as $key ) { $count = $count . $key; } $count = mb_strlen(str_replace([0,1,2,4,5,6,7,8,9], [''], $count )); return $count; } echo countEqualNum($arr); echo '<br>'; echo countEqualNum($arr2);
Вариант для задачи 22: PHP: echo substr_count(implode('', $arr), '3'); echo '<br>'; echo substr_count(implode('', $arr2), '3');
23) Узнайте сколько дней осталось до Нового Года. Скрипт должен работать в любом году PHP: $date = date_create(); //текущая дата $datka = date_format($date, 'd.n.Y'); $newYear = 12; //последний месяц года $arr = explode('.', $datka); $month = []; //здесь будет количество дней, в каждом месяце текущего года for($i = 1; $i <=12; $i++) { $month[$i] = date("t", mktime(0, 0, 0, $i, $arr[0], $arr[2])); } echo '<pre>'; print_r($month); echo '</pre>'; $ostatok = 0; for($j = $arr[1]; $j <=12; $j++) { //$arr[1]отсчёт начинается с текущего месяца (складываются все дни) $ostatok= $ostatok + $month[$j]; } echo 'Количество дней до Нового года: ' . ($ostatok - $arr[0]);
Полезность данного решения сомнительна. Это ж просто задачка тривиальная. Ты молодец, что ее решил, но это так себе лайвхак. Да и решение краааайне спорное. Зачем циклы? И, как твое предыдущее решение, тоже может быть сделано всего парой строчек кода. Завязывай в общем. Все подряд сюда не надо складывать. И учись работать с датой.
Варианты для задачи 23: PHP: idate('z', mktime(0, 0, 0, 12, 31, idate('Y'))) + 1 - idate('z'); // или (int)((mktime(0, 0, 0, 1, 1, idate('Y')+1) - time()) / 86400) + 1; с поправкой: ...в любом году UNIX-времени.
24) Преобразование в римские цифры. PHP: function ToRomanNumerals($num, $prefix='***') { static $cnv = [ ['','I','II','III','IV','V','VI','VII','VIII','IX'], ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC',], ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM',], ['','M','MM','MMM'], ]; $ns = strrev((int)$num); return ($num > 3999 ? $prefix : '') . ($cnv[3][$ns{3} ?? 0] ?? '') . $cnv[2][$ns{2} ?? 0] . $cnv[1][$ns{1} ?? 0] . $cnv[0][$ns{0} ?? 0]; Один из самых коротких и самых быстрых вариантов.
Может и не особо короче, но побыстрее: PHP: <?php function int2roman($n) { $M = ["","M","MM","MMM"]; $C = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"]; $X = ["","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"]; $I = ["","I","II","III","IV","V","VI","VII","VIII","IX"]; return $M[$n/1000].$C[($n % 1000)/100].$X[($n % 100)/10].$I[($n % 10)]; // или вместо конкатенации // return sprintf('%s%s%s%s', $M[$n/1000],$C[($n % 1000)/100],$X[($n % 100)/10],$I[($n % 10)]); } echo int2roman(2019);
25) Вывести число гигабайт в формате "*** Тб *** Гб" PHP: $f = '20,999.7'; $result = preg_replace(['/[^\d\.]/','/(\d{3}\.\d+)/', '/(\d+)(?=\d{3}\.)/'], ['', '$1 Гб', '$1 Тб '], $f); // = 20 Тб 999.7 Гб п.с. Навеяло темой в другом форуме: https://phpclub.ru/talk/threads/Конвертировать-Гигабайт-Терабайт.86087/
26) Число вторников между датами. PHP: $delta = strtotime($data_upto .' tuesday next week - 1 week') - strtotime($data_from .' tuesday'); $count = intdiv($delta, 604800) + 1; // число вторников Пример: PHP: $data_from = '2020-01-01'; $data_upto = '2020-03-31'; $delta = strtotime($data_upto .' tuesday next week - 1 week') - strtotime($data_from .' tuesday'); $count = intdiv($delta, 604800) + 1; // число вторников var_dump($count); // int(13)
27) Из HEX-строки получить "printable"-строку. PHP: function HexToPrintable($hex) { return preg_replace_callback('/=(.{2})/', function($matches) { return '\x' . strtolower($matches[1]); }, quoted_printable_encode(hex2bin($hex))); } Пример: PHP: print_r([HexToPrintable('2cd2d948cfaf4b1097530f7c74fb6737'), ',\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7']); /* Array ( [0] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7 [1] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7 ) */
28) Получить город из адреса Алгоритм. Т.к. адрес это список с разделителями в виде запятых, то: 1. Найти элемент списка с одиночной буквой "г"; 2. Удалить "г" или "г."; 3. Удалить начальные и конечные пробелы Пример: PHP: // Просто список адресов $addresses = explode("\n", 'Республика Карелия, Беломорский район, г. Беломорск, Мерецкова улица, 6 Ханты-Мансийский автономный округ - Югра, 628616, г Нижневартовск, ул Менделеева, Республика Крым, 298302, Крым Респ, Керчь г, Жени Дудник ул, дом 1 Республика Татарстан, г. Набережные Челны, Моторная улица Город-1 г, Моторная улица Город-2 г Республика, г. Город3'); $cities = preg_replace([ '/.*(?:,|^)(.*?\bг\b.*?)(?:,|$).*/ui', '/г[\.]*/u', '/^\s+|\s+$/u'], '$1', $addresses); print_r($cities); /* Array ( [0] => Беломорск [1] => Нижневартовск [2] => Керчь [3] => Набережные Челны [4] => Город-1 [5] => Город-2 [6] => Город3 ) */
PHP: $n=new DateTime('now'); $n31 = new DateTime('last day of december this year'); $interval=$n->diff($n31); echo $interval->format('%r%a');
29) Найти общие части слов. PHP: function GetCommonParts(array $source) { $parts = []; foreach($source as $k => $v) { $symbols = mb_str_split(mb_strtolower($v)); for($i = mb_strlen($v); $i > 0; $i--) { $kk = ''; foreach(array_slice($symbols, -$i) as $symbol) { $kk .= $symbol; $parts[$k][$kk] = null; } } } return $parts ? array_keys(array_intersect_key(...$parts)) : []; } Пример: PHP: $words = ['волк', 'восток', 'волейбол']; // Всего:: 67 частей. print_r(GetCommonParts($words)); /* Array ( [0] => в [1] => во [2] => о ) */ Скорость выполнения: порядка 0.0000003 сек/часть * Задача и исходные данные из той темы.
Поменять значения двух переменных местами (Swap): PHP: list ($v2, $v1) = [$v1, $v2]; Поменять значения трёх переменных местами (Rot): PHP: list ($v2, $v3, $v1) = [$v1, $v2, $v3];