Hledám nějaký postup, jak pracovat se stringem dál
- Blackrat
- Člen | 17
Zdravím, chtěl bych poprosit o pomoc zkušenější programátory. Mám
nějaký string, kde je datum a nějaká hodnota. String má dakovouhle
strukturu. DD.MM.YYYY|XX.XXX DD.MM.YYYY|XX.XXX DD.MM.YYYY.....
Chtěl bych pracovat nějak s hodnotami toho stringu v rámci měsíců. Asi
nejlepší by bylo udělat si 12 polí podle měsíce a do pole leden
přiřadit příslušné hodnoty. Hodnot je asi 300 a opravdu nevím, jak se
k tomu dopracovat. Nejdál jsem se dostal k explode (‚|‘, $string); ale
dál nevidím východisko.
- Pepino
- Člen | 257
@Blackrat
https://doc.nette.org/…ils/datetime
https://www.php.net/…e.format.php#…
Editoval Pepino (5. 4. 2022 11:12)
- nightfish
- Člen | 518
@Blackrat
Pokud má string strukturu
DD.MM.YYYY|XX.XXX DD.MM.YYYY|XX.XXX DD.MM.YYYY.....
, tak chceš
nejdřív asi explode()
podle mezery – čímž dostaneš pole
řetězců (např.) ['01.01.2000|12.345', '15.01.2000|66.666']
.
Tohle pole budeš postupně procházet a řetězce explodovat podle
|
– dostaneš dvě části – první bude stringový zápis
datum, druhé bude nějaká hodnota. Stringový zápis datumu si převedeš na
objekt typu DateTimeImmutable
, aby se ti s ním lépe pracovalo.
Pak můžeš přiřazovat do pole ve stylu
$result[(int)$date->format('n')][] = $value;
(kde
$result
je pole, do kterého ukládáš výsledek;
$date
je zparsované datum v podobě
DateTimeImmutable
a $value
je hodnota za
svislítkem – tedy např. 12.345
).
Výsledné pole bude vypadat takto:
$result = [
1 => [12.345, 66.666, ...], // leden
2 => [45.678, 98.765, 654.65, ...], // únor
...
12 => [12.345, 12.345, ...], // prosinec
];
- Blackrat
- Člen | 17
@nightfish
Čau, podle mezery jsem to zkoušel, ale nefungovalo mi to. Mám nějakou URL
z toho dostanu pomocí fce file_get_contents string. Když dám ale separator |
tak mi to funguje a rozdělí se to. Mezeru mi to z nějakého důvodu nebere.
Když si ale napíšu vlastní $input string a do něj dám ručně ty samé
hodnoty, tak je vše v pořádku
$data = file_get_contents("$url");
$array = explode(' ', $data);
Editoval Blackrat (5. 4. 2022 12:34)
- Blackrat
- Člen | 17
@Pepino
Moje lajcké oko vidí mezeru :/
https://www.cnb.cz/…/vybrane.txt?…
https://ibb.co/m6Pp4rL
- Ozzrel
- Generous Backer | 54
Na ČNB používám tohle, jednou za den stáhnu a nacpu do DB tam si proto chodím dle potřeby.
public function readcnb()
{
$url = 'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.xml';
$xml = simpleXML_load_file($url, "SimpleXMLElement", LIBXML_NOCDATA);
if ($xml === false) {
$this->logger->error('CNBkurz XML parse error');
} else {
$rate = json_decode(json_encode($xml), true);
foreach ($rate['tabulka']['radek'] as $value) {
$value['@attributes']['kurz'] = str_replace(',', '.', $value['@attributes']['kurz']);
// něco stím provedu ... (DB, nebo local)
}
}
}