RSS Op de kop
Ik draai op mijn server momenteel test met een systeem die p2000 meldingen (Brandweer,Politie,Ambulance) opslaat in een DB + verstuurt naar twitter. Het opslaan en uitlezen is de db is geen probleem omdat ik deze bij het uitlezen order. Het tweeten echter wel, op het moment dat er meerdere meldingen getweet word komt de nieuwste als eerst en de oudste als laatst (logisch want zo leest de foreach de rss uit). Nu wil ik echter dat de niewste als laatst komt en de oudste als eerst (dat ze dus in de goede volgorde staan) Is het mogelijk om het uitlezen van oud naar nieuw te laten gebeuren, of op een andere manier dit goed te laten tweeten?
Matthijs
array_reverse uitvoeren.
Ik weet niet hoe je ze uitleest, maar het lijkt me dat je een array krijgt met alle meldingen en dan kun je gewoon een Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$countbrw = 0;
$brandweer = simpleXML_load_file('http://feeds.livep2000.nl/?r=25&d=1');
foreach ($brandweer->channel->item as $brandweer){
if($countbrw < 10){
$countbrw++;
$title_brandweer = $brandweer->title;
$dag_brandweer = date( 'l', strtotime( $brandweer->pubDate ) );
$datumdag_brandweer = date( 'd', strtotime( $brandweer->pubDate ) );
$maand_brandweer = date( 'm', strtotime( $brandweer->pubDate ) );
$jaar_brandweer = date( 'y', strtotime( $brandweer->pubDate ) );
$time_brandweer = date( 'H:i', strtotime( $brandweer->pubDate ) );
$description = $brandweer->description;
$namespaces_brw = $brandweer->getNameSpaces(true);
$geobrw = $brandweer->children($namespaces_brw['geo']);
$lat_brandweer = $geobrw->lat;
$long_brandweer = $geobrw-> long;
?>
$countbrw = 0;
$brandweer = simpleXML_load_file('http://feeds.livep2000.nl/?r=25&d=1');
foreach ($brandweer->channel->item as $brandweer){
if($countbrw < 10){
$countbrw++;
$title_brandweer = $brandweer->title;
$dag_brandweer = date( 'l', strtotime( $brandweer->pubDate ) );
$datumdag_brandweer = date( 'd', strtotime( $brandweer->pubDate ) );
$maand_brandweer = date( 'm', strtotime( $brandweer->pubDate ) );
$jaar_brandweer = date( 'y', strtotime( $brandweer->pubDate ) );
$time_brandweer = date( 'H:i', strtotime( $brandweer->pubDate ) );
$description = $brandweer->description;
$namespaces_brw = $brandweer->getNameSpaces(true);
$geobrw = $brandweer->children($namespaces_brw['geo']);
$lat_brandweer = $geobrw->lat;
$long_brandweer = $geobrw-> long;
?>
Dan worden er allemaal bewerkingen en checks uitgevoerd op de gegevens. En daarna word het opgeslagen in de db en getweet door het onderstaande
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$sql = mysql_query("INSERT INTO xxxxxx (ID, dag, datumdag, maand, jaar, tijd, melding, korps, soort, discipline, latitude, longtitude)
VALUES ('', '$brandweer_dag', '$datumdag_brandweer', $maand_brandweer, $jaar_brandweer, '$time_brandweer', '$title_brandweer', '$korps', '$soort_brandweer', 'brandweer', '$lat_brandweer', '$long_brandweer')");
if ($sql === false){
echo 'error';
$message = '
Updaten van P2000 database op xxxxx is mislukt op: '. date("d-m-Y @ H:i:s"). ' Reden: Wegschrijven mislukt Brandweer
';
mail('xxxx', 'P2000 Database update mislukt', $message, 'From: xxxxx');
}
else{
echo "Succesful: $brandweer_dag $datumdag_brandweer-$maand_brandweer-$jaar_brandweer $time_brandweer $title_brandweer $korps $soort_brandweer <br />";
}
$brandweer_full = "Melding BRW (".$datumdag_brandweer."-".$maand_brandweer." ".$time_brandweer.") ".$title_brandweer."";
if (strlen($brandweer_full) >= 140){
$brandweer_full = substr_replace($brandweer_full, '...', 137, 137);
}
$tweet->post('statuses/update', array('status' => $brandweer_full)); echo "Tweet: $brandweer_full <br /><br />";
?>
$sql = mysql_query("INSERT INTO xxxxxx (ID, dag, datumdag, maand, jaar, tijd, melding, korps, soort, discipline, latitude, longtitude)
VALUES ('', '$brandweer_dag', '$datumdag_brandweer', $maand_brandweer, $jaar_brandweer, '$time_brandweer', '$title_brandweer', '$korps', '$soort_brandweer', 'brandweer', '$lat_brandweer', '$long_brandweer')");
if ($sql === false){
echo 'error';
$message = '
Updaten van P2000 database op xxxxx is mislukt op: '. date("d-m-Y @ H:i:s"). ' Reden: Wegschrijven mislukt Brandweer
';
mail('xxxx', 'P2000 Database update mislukt', $message, 'From: xxxxx');
}
else{
echo "Succesful: $brandweer_dag $datumdag_brandweer-$maand_brandweer-$jaar_brandweer $time_brandweer $title_brandweer $korps $soort_brandweer <br />";
}
$brandweer_full = "Melding BRW (".$datumdag_brandweer."-".$maand_brandweer." ".$time_brandweer.") ".$title_brandweer."";
if (strlen($brandweer_full) >= 140){
$brandweer_full = substr_replace($brandweer_full, '...', 137, 137);
}
$tweet->post('statuses/update', array('status' => $brandweer_full)); echo "Tweet: $brandweer_full <br /><br />";
?>
Matthijs Vos op 14/07/2012 20:40:40:
Nee, Ik krijg ze niet in een array ik doe hetvolgende:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
//..
$dag_brandweer = date( 'l', strtotime( $brandweer->pubDate ) );
$datumdag_brandweer = date( 'd', strtotime( $brandweer->pubDate ) );
$maand_brandweer = date( 'm', strtotime( $brandweer->pubDate ) );
$jaar_brandweer = date( 'y', strtotime( $brandweer->pubDate ) );
$time_brandweer = date( 'H:i', strtotime( $brandweer->pubDate ) );
//..
?>
//..
$dag_brandweer = date( 'l', strtotime( $brandweer->pubDate ) );
$datumdag_brandweer = date( 'd', strtotime( $brandweer->pubDate ) );
$maand_brandweer = date( 'm', strtotime( $brandweer->pubDate ) );
$jaar_brandweer = date( 'y', strtotime( $brandweer->pubDate ) );
$time_brandweer = date( 'H:i', strtotime( $brandweer->pubDate ) );
//..
?>
Ik vraag me af waarom je dit doet, je hebt al een datum met een tijd dus dat kun je dan als zodanig in je tabel opslaan.
Gewijzigd op 15/07/2012 08:41:36 door Ger van Steenderen
Je bedoelt gewoon de momentele tijd pakken? Ik pak express de tijd van de melding omdat als de server tijdelijk wegvalt o.i.d. er later in de db alsnog de goede tijd komt te staan.
$brandweer->pubdate is toch altijd vast? Je gaat dat ontleden in gedeeltes, lijkt mij een beetje dubbelop.
Ohh dat bedoel je, dat heb ik ontleed i.v.m. de ORDER BY, anders werkte deze niet goed.
Als je datum in het goede formaat (YYYY-MM-DD HH:MM:SS) staat zou dat niet uit moeten maken, naar mijn gevoel is PHP erg traag met datum/tijd conversies, dus probeer ik die zoveel mogelijk te vermijden.
Wat is $brandweer?
Juist, een array.
Maak er eens dit van:
Code (php)
1
2
3
4
2
3
4
<?php
$brandweer = simpleXML_load_file('http://feeds.livep2000.nl/?r=25&d=1');
$brandweer = array_reverse($brandweer);
?>
$brandweer = simpleXML_load_file('http://feeds.livep2000.nl/?r=25&d=1');
$brandweer = array_reverse($brandweer);
?>
Volgens mij staat je array nu andersom gesorteerd.
Mocht dat niet werken, probeer dan dit:
Code (php)
1
2
3
4
2
3
4
<?php
$brandweer_rev = array_reverse($brandweer->channel->item);
foreach($brandweer as $brandweer)
?>
$brandweer_rev = array_reverse($brandweer->channel->item);
foreach($brandweer as $brandweer)
?>
Gewijzigd op 15/07/2012 11:58:19 door Eddy E
vardump op jouw $brandweer: NULL
@Matthijs
Is het een idee om een kolom op te nemen in je tabel waarin je bijhoud of er al dan niet getweet is? Dus je insert eerst in de tabel en vanuit de tabel tweet je.
Ja sorry, zag het later ook. Vandaar mijn wijziging in voorgaand bericht.
Een iterator object wel te verstaan, je kan dus de functie iterator_to_array gebruiken, de array omgooien en vervolgens plaatsen in de foreach.
Edit:
Nee, het is geen Iterator maar een Traversable. Je moet dit omzetten in een SimpleXMLIterator en dan die omtoveren naar een array (iterator_to_array) en dat nog eens omgooien (array_reverse) en dan heb je hem zoals je wilt
Gewijzigd op 15/07/2012 12:11:06 door Wouter J
Hoe dan ook, dit lijkt mij ook niet de oplossing voor TS, ik heb voor dit soort situaties een simpele maar botte oplossing dmv van een multiple row insert:
Code (php)
1
2
2
INSERT IGNORE INTO feeditems (item_id, pubdate, tweeted [,........])
VALUES (12345, '2012-07-14 13:01:00', 0),(34567, '2012-07-15 11:11:11', 0) --etc.
VALUES (12345, '2012-07-14 13:01:00', 0),(34567, '2012-07-15 11:11:11', 0) --etc.
Hierdoor worden als je een unique key zet op de nodige kolom(men) alleen nieuwe waardes ingevoerd.
Gewijzigd op 15/07/2012 12:40:02 door Ger van Steenderen
Door een crash van mijn laptop heb ik een tijdje niet gereageerd.
De methode om het in een db op te slaan of het getweet is of niet kan niet, want dan gaat de snelheid van het systeem omlaag, en de bedoeling is dat het zo realtime mogelijk is. De methode van Wouter lijkt me wel handig, alleen dat van SimpleXMLIterator snap ik niet. Kan iemand met dit uitleggen?
Matthijs