Autor | Zpráva | ||
---|---|---|---|
Conficker88 Profil |
#1 · Zasláno: 4. 3. 2011, 22:33:13 · Upravil/a: Conficker88
Dobrý den,
teprve s PHP začínám, proto se obracím na ostatní s prosbou... Potřeboval bych poradit s vyřešením jednoho problému. Mám seznam čísel např.: 2-5, 8, 10, 15-17 a potřeboval bych napsat funkci nejlépe s funkci "explode()", která by takový zápis převedla na pole jednotlivých hodnot, tedy v tomto případě 2, 3, 4, 5, 8, 10, 15, 16, 17. Vím jak pomocí funkce "explode()" vypsat tyto hodnoty ve tvaru 2, 5, 8, 10, 15, 17, ale už si nevím rady s tím jak napsat funkci, která by i doplňovala hodnoty v daném rozsahu. Předem děkuji za jakoukoliv odpověď či radu. |
||
Tori Profil |
#2 · Zasláno: 4. 3. 2011, 22:40:23 · Upravil/a: Tori
Použila bych asi tenhle postup:
Pomocí explode rozsekat na jednotlivé části mezi čárkami. Pak najít ty, které obsahují pomlčku a pomocí range přidat do cílového pole (a smazat původní prvek pole). edit: ↓ Zajímavé, to shodné zadání. Nehledala jsem. edit2: Ještě bych ke zmíněnému řešení přidala odstranění mezer (anebo abs() ), aby se negenerovala čísla do záporných hodnot. |
||
petr 6 Profil |
#3 · Zasláno: 4. 3. 2011, 22:44:31 · Upravil/a: petr 6
Určitě se to tady už řešilo, jen to najít...
Edit: Třeba tady Edit 2: Tak se koukám, máte stejný seznam čísel. Že byste oba měli ten samý předmět...? |
||
jsim Profil |
#4 · Zasláno: 5. 3. 2011, 00:09:23
jedno z možných řešení
<?php $numbers = "2-5,8,10,15-17"; function conversion($input){ $numbers = explode(",", $input); $arr = array(); foreach ($numbers as $number) { if (preg_match("#^\d+-\d+$#", $number, $match)) { $temp = explode("-", $match[0]); foreach (range($temp[0], $temp[1]) as $val) { $arr[] = $val; } } else { $arr[] = $number; } } return implode(",", $arr); } print(conversion($numbers)); |
||
Tori Profil |
#5 · Zasláno: 5. 3. 2011, 08:13:09 · Upravil/a: Tori
jsim:
Tohle řešení mi připadá zbytečně zdlouhavé... proč vytvářet (range) pole a pak ho procházet jen proto, aby se jeho prvky přidaly k dalšímu poli? Kdyby byl cílem řetězec, šlo by to udělat i jedním replacem: $rada = '2-5, 8, 10, 15-17'; $rada = preg_replace('/(\d+)-(\d+)/e', 'implode(", ",range($1, $2))', $rada); |
||
Conficker88 Profil |
#6 · Zasláno: 5. 3. 2011, 08:22:32 · Upravil/a: Conficker88
Dobré ráno, děkuji všem za odpovědi, pomohli jste mi. Petr 6 má pravdu, potřeboval jsem to taky do školy, ale do jiného předmětu.
Je sranda, že už tu stejný problém před rokem řešil někdo jiný :-) ale při hledání jsem jej asi přehlédl. Ještě bych chtěl poprosit o poslední radu. Můžete ještě proletět následující funkci a podívat se, kde mám chybu? Sice funguje, ale hlásí mi to neustále chybu na 4. řádku. "Undefined index: a in C:\Programy\EasyPHP\www\KU3.php on line 4", pak to samé s c i b. Tato funkce má za úkol zjistit kolikrát se v poli vyskytují definovaná písmena. function cetnosti($pole){ $pom = array(); foreach($pole as $k => $h){ if ($pom[$h] > 0){ $pom[$h]++; } else { $pom[$h] = 1; } } foreach ($pom as $k => $h){ echo "$k: $h krát <br>"; } } echo cetnosti(array('a', 'c', 'c', 'a', 'c', 'b')); Opět předem díky za jakoukoliv radu. |
||
Joker Profil |
#7 · Zasláno: 5. 3. 2011, 08:29:36 · Upravil/a: Joker
Conficker88:
„Undefined index: a in C:\Programy\EasyPHP\www\KU3.php on line 4“ Nedefinovaný index „a“ v poli na řádku 4. $pom je na začátku prázdné pole, takže napoprvé není žádný index definovaný. Řešitelné nahrazením podmínky if ($pom[$h] > 0){ if (!empty($pom[$h])){ |
||
Tori Profil |
#8 · Zasláno: 5. 3. 2011, 08:48:35
Conficker88:
„Tato funkce má za úkol zjistit kolikrát se v poli vyskytují definovaná písmena.“ Stačí pohledat v manuálu: array_count_values() |
||
Časová prodleva: 13 let
|
0