Poket Bernama dalam Ungkapan Biasa PHP

Katakan kita ingin menggunakan preg_match untuk memisahkan tarikh kepada hari, bulan dan tahun. Kita akan menggunakan poket untuk tujuan ini:

php<?php
  $str = '2025-10-29';
  $reg = '#(\d{4})-(\d{2})-(\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match); // akan output ['2025-10-29', '2025', '10', '29']
?>

Seperti yang anda lihat, hasilnya kita mendapat array, di mana elemen sifar akan mengandungi keseluruhan tarikh, elemen pertama - tahun, elemen kedua - bulan, elemen ketiga - hari.

Walau bagaimanapun, kadangkala adalah lebih mudah untuk mendapatkan kandungan poket dalam bentuk array asosiatif. Iaitu, dalam kes kami, adalah baik untuk mendapatkan array seperti ini:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29'
]

Untuk ini, terdapat sintaks khas dalam ungkapan biasa. Inilah dia: (?<name>pattern), di mana pattern ialah ungkapan biasa, dan name ialah nama poket.

Mari kita tulis semula ungkapan biasa tarikh kami menggunakan poket bernama:

php<?php
  $str = '2025-10-29';
  $reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match);
?>

Hasilnya, kita akan mendapat array asosiatif di mana kuncinya ialah nama poket, dan nilainya ialah kandungan yang ditangkap:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
]

Sebenarnya, dalam array hasil, nilai poket akan boleh diakses sama ada melalui nama ataupun nombor indeks. Contohnya, tahun boleh diakses melalui kunci 'year' dan nombor 1, bulan - melalui kunci 'month' dan nombor 2 dan seterusnya:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
  
  1       => '2025',
  2       => '10',
  3       => '29'
]

Poket bernama yang diterangkan ini mempunyai beberapa sintaks alternatif: (?P<name>pattern) dan (?'name'pattern).

Задание 1

Diberi rentetan masa:

php<?php
  $str = '12:59:59';
?>

Letakkan jam, minit dan saat ke dalam poket bernama yang berasingan.

Задание 2

Tulis fungsi yang dalam array hasil akan memadam semua poket bernombor, hanya meninggalkan poket bernama.