Úloha 12: Ověření IČ (Identifikačního čísla osoby)

Mírně pokročilý vážený součet modulo 11 validace MathML

Cíl úlohy

Vytvořte skript pro ověření platnosti identifikačního čísla osoby (IČ / IČO) používaného v České republice. IČ je osmimístné číslo, jehož poslední (osmá) číslice je kontrolní a počítá se pomocí váženého součtu prvních 7 číslic se sestupnými váhami.

Algoritmus výpočtu kontrolní číslice IČ (MathML)

1. Vypočteme vážený součet A prvních sedmi číslic s váhami od 8 do 2:

A = ∑ i=1 7 ci ⋅ (9−i) = 8c1 + 7c2 + 6c3 + 5c4 + 4c5 + 3c6 + 2c7

2. Zbytek z po dělení číslem 11: z=Amod11.

3. Kontrolní číslice c8 se určí podle pravidla:

  • Pokud z=0 nebo z=10, pak c8=1
  • Pokud z=1, pak c8=0
  • V ostatních případech: c8=11−z

Úvahy a doporučený postup řešení

  • Očištění vstupu: Uživatel může zadat IČ s mezerami (např. 255 96 641). Použijte preg_replace('/\s+/', '', $ic).
  • Kontrola formátu: IČ musí mít přesně 8 číslic: preg_match('/^\d{8}$/', $ic).
  • Procházení řetězce: V PHP lze k jednotlivým znakům řetězce přistupovat jako k prvkům pole, např. $ic[0] až $ic[6].

Doplňující otázky k zamyšlení a náměty na rozšíření

  • 1. Jak se nazývá veřejný rejstřík Ministerstva financí ČR (ARES), z něhož lze pomocí REST API načíst název firmy podle platného IČ?
  • 2. Proč se v algoritmu používají právě váhy 8, 7, 6, 5, 4, 3, 2 a dělení 11? Proti jakým nejčastějším chybám při ručním opisování tento kontrolní součet chrání (např. záměna dvou sousedních číslic, překlep v jedné číslici)?

Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu overeni_ic.php