Autor Zpráva
Conficker88
Profil
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
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
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
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
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
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
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){
za
if (!empty($pom[$h])){
Tori
Profil
Conficker88:
Tato funkce má za úkol zjistit kolikrát se v poli vyskytují definovaná písmena.
Stačí pohledat v manuálu: array_count_values()

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: