Autor Zpráva
havran99
Profil
Zdravim mam xml parser ktory mi bezi v pohode ale potreboval by som vytiahnut od aktualneho casu program a dajme tomu len 3 riadky. Skusal som no neprisiel som na to ako. Budem rad ak mi niekto pomoze.

<?xml version="1.0" encoding="UTF-8"?>
<tv>
  <channel id="JOJ">
    <display-name lang="cs">JOJ</display-name>
  </channel>
  <programme start="20141002052000 +0200" stop="20141002060000 +0200" channel="JOJ">
    <title lang="cs">Velké zprávy TV JOJ (?)</title>
  </programme>
  <programme start="20141002060000 +0200" stop="20141002080000 +0200" channel="JOJ">
    <title lang="cs">Dobré ráno (?)</title>
    <desc lang="cs">Dobré ráno, lepší ráno!(živě)&lt;br /&gt;</desc>
  </programme>
  <programme start="20141002080000 +0200" stop="20141002090500 +0200" channel="JOJ">
    <title lang="cs">Soudní síň (?)</title>
    <desc lang="cs">Nechceš si mě vzít&lt;br /&gt;
Soudní případy ze Slovenska plné emocí, které jsou inspirovány skutečností (2013). Hrají: J. Penc a další. Režie B. Mišík(r)</desc>
  </programme>
  <programme start="20141002090500 +0200" stop="20141002095500 +0200" channel="JOJ">
    <title lang="cs">Soudní síň (?)</title>
    <desc lang="cs">Paroháč&lt;br /&gt;
Soudní případy ze Slovenska plné emocí, které jsou inspirovány skutečností (2014)(r)</desc>
  </programme>
  <programme start="20141002095500 +0200" stop="20141002110000 +0200" channel="JOJ">
    <title lang="cs">Panelák XIV (22) (?)</title>
    <desc lang="cs">Filip strávil noc u Márii. Julka se rozhodla, že bude běhat s Goranem a Ivanou. Zabrání jí v tom? Lacko žádá Janku o radu(r)</desc>
  </programme>
  </tv>

<?php
$xml = simplexml_load_file('http://192.168.3.100/guide.xml');
echo "<table>\n";
    foreach($xml->programme as $match){
        echo "<tr><td>";
        $cas = (string)$match['start'];
        $hodina = substr($cas, 8, 2);
        $minuta = substr($cas, 10, 2);
        $zaciatok_hodiny = (string)($hodina.":".$minuta);
        echo "</td><td>";
        $cas = (string)$match['stop'];
        $hodina = substr($cas, 8, 2);
        $minuta = substr($cas, 10, 2);
        $koniec_hodiny = (string)($hodina.":".$minuta);
        $koniec_cas = (string)($zaciatok_hodiny." - ".$koniec_hodiny);
        echo $koniec_cas;
        echo "</td><td>";
        $titul = $match->title;
        $titulok = str_replace("(?)","",$titul);
        echo $titulok; 
        echo "</td></tr>\n";
        }
echo "</table>\n";        

?>
Tori
Profil
Přidejte si před cyklus proměnnou $ted s aktuálním časem (instance DateTime). Když pak tyhle řádky:
$cas = (string)$match['start'];
        $hodina = substr($cas, 8, 2);
        $minuta = substr($cas, 10, 2);
        $zaciatok_hodiny = (string)($hodina.":".$minuta);
nahradíte tímhle:
$start = new DateTime((string)$match['start']);
        $zaciatok_hodiny = $start->format('H:i');
(a analogicky u času, kdy ta relace končí), tak můžete snadno porovnávat if ($start > $ted) { .. program právě probíhá }
juriad
Profil
Já bych to řešil trošku jinak, tak aby nezávislo na pořadí programů v tom xml souboru.
V poli si budu udržovat nejvýše N nejmenších hodnot a pak si jena konci můžu třeba vypsat do tabulky.

# enlists the $val if it is one of the forst $n values according to the $cmp function
# drops the superfluous values
function bestN(array &$arr, $n, $cmp, $val) {
        for ($i = 0; $i < count($arr); $i++) {
                $c = call_user_func($cmp, $val, $arr[i]);
                if ($c < 0) {
                        array_splice($arr, $i, 0, $val);
                        if (count($arr) > $n) {
                                array_pop($arr);
                        }
                        return;
                }
        }
        if (count($arr) < $n) {
                $arr[] = $val;
        }
}

# compares two programmes based on their ending times
function programmeCmp($p1, $p2) {
        $e1 = DateTime::createFromFormat('YmdHis O', $p1['stop']);
        $e2 = DateTime::createFromFormat('YmdHis O', $p2['stop']);
        if ($e1 < $e2) {
                return -1;
        } else if ($e1 > $e2) {
                return 1;
        } else {
                return 0;
        }
}

$xml = simplexml_load_file('./guide.xml');
$programmes = array(); # this will contain at most 3 nearest programmes
$current = new DateTime('yesterday'); # set this to 'now'

foreach($xml->programme as $match) {
        $end = DateTime::createFromFormat('YmdHis O', $match['stop']);
        # if the programme hasn't finished yet
        if ($end > $current) {
                # try to add it into the list
                bestN($programmes, 3, 'programmeCmp', $match);
        }
}

# prints three programmes in the nearest future
var_dump($programmes);
havran99
Profil
juriad: funguje to akurat som musel zmenit yesterday na now a uz to vypisuje od aktualneho casu ale vypis mam takto:

array(3) { [0]=> object(SimpleXMLElement)#7 (3) { ["@attributes"]=> array(3) { ["start"]=> string(20) "20141002095500 +0200" ["stop"]=> string(20) "20141002110000 +0200" ["channel"]=> string(3) "JOJ" } ["title"]=> string(21) "Panelák XIV (22) (?)" ["desc"]=> string(134) "Filip strávil noc u Márii. Julka se rozhodla, že bude běhat s Goranem a Ivanou. Zabrání jí v tom? Lacko žádá Janku o radu(r)" } [1]=> object(SimpleXMLElement)#6 (3) { ["@attributes"]=> array(3) { ["start"]=> string(20) "20141002110000 +0200" ["stop"]=> string(20) "20141002120000 +0200" ["channel"]=> string(3) "JOJ" } ["title"]=> string(38) "Nejkrásnější bydlení III (13) (?)" ["desc"]=> string(155) "Kanadská reality show (2010-2011). Moderují: J. Silver Scott, D. Scott, A. Barrettová. Režie S. Cluer, S. Obljubeková, B. Quigley, Ch. Zalamedaová(r)" } [2]=> object(SimpleXMLElement)#5 (2) { ["@attributes"]=> array(3) { ["start"]=> string(20) "20141002120000 +0200" ["stop"]=> string(20) "20141002130000 +0200" ["channel"]=> string(3) "JOJ" } ["title"]=> string(20) "Zprávy ve 12:00 (?)" } } 
juriad
Profil
havran99:
To yesterday jsem použil záměrně, protože v ukázce toho xml byly všechny časy už v minulosti.
Ta moje ukázka je vlastně jen preprocessing; $programmes je pole xml elementů.
Stačí tedy následně použít tvůj původní kód (řádky 3 až 23) s tím, že změníš foreach na:
    foreach($programmes as $match){
havran99
Profil
jasneee pochopil som, vdaka.

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: