Hledám nějaký postup, jak pracovat se stringem dál

Blackrat
Člen | 17
+
0
-

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
+
0
-
nightfish
Člen | 518
+
0
-

@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
+
0
-

@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)

Pepino
Člen | 257
+
0
-

@Blackrat Možná to není mezera. Koukal jsi do zdrojáku výstupu té URL ?

Blackrat
Člen | 17
+
0
-

@Pepino
Moje lajcké oko vidí mezeru :/
https://www.cnb.cz/…/vybrane.txt?…
https://ibb.co/m6Pp4rL

Pepino
Člen | 257
+
0
-

@Blackrat to není mezera ale nový řádek. explode("\n", $input) a potom v cyklu explode("|", $radek)

Blackrat
Člen | 17
+
0
-

@Pepino \n jsem zkusil hned jak si se zeptal na zdroják a bez výsledku :)

$data = file_get_contents("$url");
$array = explode ('\n', $data);
var_dump($array);

Pepino
Člen | 257
+
0
-

@Blackrat místo apostrofů dej uvozovky.

$data = file_get_contents($url);
$array = explode ("\n", $data);
var_dump($array);
Ozzrel
Generous Backer | 54
+
0
-

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)
			}
		}
	}