[RESOLU] Filtrer un tableau en fonction d'une valeur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Filtrer un tableau en fonction d'une valeur

Re: Filtrer un tableau en fonction d'une valeur

par moogli » 29 août 2013, 10:29

Modération :
Puisque ta question est résolue, je l'indique en cliquant sur le bouton "Mettre le sujet en tant que Résolu" pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.

Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert situé en haut de la page à côté du titre, si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)


Sinon de rien ;)

Re: Filtrer un tableau en fonction d'une valeur

par zaza » 29 août 2013, 00:41

J'ai résolu mon soucis. :D Merci moogli pour ton conseil qui m'a mise sur la voie. J'ai donc utilisé une condition en portant la variable, ce qui donne au final :
unction RSS_Display($url, $size = 0, $site = 0)
{
	global $RSS_Content;
	$opened = true;
	$page = "";
	$site = (intval($site) == 0) ? 1 : 0;

	RSS_Retrieve($url);
	if($size > 0)

	$recents = array_slice($RSS_Content, $site, $size + 1 - $site);
   //utilisation de la fonction
	$final = sort_by_key($recents, 'nom_nature');
	
	foreach($final as $article)
	{
		$type = $article["type"];
		if($article['nom_nature'] =='Fournitures')
		{
			if($opened == true)
			{
				$page .="<table width='700' cellpadding='0' cellspacing='0'>
				<tr>
				<td class='bleu'>Reference</td>
				<td class='bleu'>Intitule</td>
				<td class='bleu'>Type de marche</td>
				<td class='bleu'>Service</td>
				<td class='bleu'>Date limite de remise des plis</td>
				<td class='bleu'>Type de procedure</td>
				</tr>";
				$opened = false;
			}
		
		$title = $article["title"];
		$link = $article["link"];
		$description = $article["description"];
		$reference = $article["reference"];	
		$nom_nature = $article["nom_nature"];				
		$consultation = $article["consultation"];		
		$nom_collectivite = $article["nom_collectivite"];
		$datelimite = $article["datelimite"];
		$nom_procedure = $article["nom_procedure"];
		
			$page .="<tr>
		<td><a href=\"$link\">$reference</a></td>
		<td><a href=\"$link\">$title</a></td>
		<td><a href=\"$link\">$nom_nature</a></td>
		<td><a href=\"$link\">$nom_collectivite</a></td>
		<td><a href=\"$link\">$datelimite</a></td>
		<td><a href=\"$link\">$nom_procedure</a></td>
		
		</tr></ul>\n";
		}
		else
		{
			if($opened == false) 
			{
				$page .= "</table>";			
				$opened = true;
			}
		}	
		$page .= "</ul>\n";	
	}

	if($opened == true)
	{	
		$page .="</table>";
	}
	if($opened == false)
	{	
		$page .="<h1>Il n'y a pas actuellement de consultation</h1><br /><br /><br /><br />\n";
	}	
	return $page."\n";
	
}

Re: Filtrer un tableau en fonction d'une valeur

par moogli » 28 août 2013, 18:25

ajoute des conditions (if) pour rejeter les infos que tu ne souhaite pas.

a priori tu as tous ce qu'il te faut dans $article ?


@+

Re: Filtrer un tableau en fonction d'une valeur

par zaza » 28 août 2013, 17:05

Bonjour moogli,

J'ai utilisé une fonction pour faire le tri sur array[nom_nature]. Cela fonctionne parfaitement. Mais maintenant je voudrais afficher seulement les lignes qui comporte comme élément "Fournitures" et ne pas afficher celles dont [nom_nature] est "Services" ou "Travaux".

Voici la fonction
function sort_by_key($array, $index) {
$sort = array();
//préparation d'un nouveau tableau basé sur la clé à trier
foreach ($array as $key => $val) {
$sort[$key] = $val[$index];
}
//tri par ordre naturel et insensible à la casse
natcasesort($sort);
//formation du nouveau tableau trié selon la clé
$output = array();
foreach($sort as $key => $val) {
$output[] = $array[$key];
}
return $output;
}

Maintenant la fonction qui traite le tableau
function RSS_Display($url, $size = 0, $site = 0)
{
	global $RSS_Content;

	$opened = false;
	$page = "";
	$site = (intval($site) == 0) ? 1 : 0;

	RSS_Retrieve($url);
	if($size > 0)

	$recents = array_slice($RSS_Content, $site, $size + 1 - $site);
                $final = sort_by_key($recents, 'nom_nature');

	foreach($final as $article)
	{
		$type = $article["type"] ;	
		if($type == 0)
		{
			if($opened == true)
			{
				$page .="</ul>\n";
				$opened = false;
			}
			$page .="<b>";
		}
		else
		{
			if($opened == false)
			
			{
				$page .= "<table width='700' cellpadding='0' cellspacing='0'>
				<tr>
				<td class='bleu'>Reference</td>
				<td class='bleu'>Intitule</td>
				<td class='bleu'>Type de marche</td>
				<td class='bleu'>Service</td>
				<td class='bleu'>Date limite de remise des plis</td>
				<td class='bleu'>Type de procedure</td>
				</tr>";
				$opened = true;
			}
		}

		$title = $article["title"];
		$link = $article["link"];
		$description = $article["description"];
		$reference = $article["reference"];
		$nom_nature = $article["nom_nature"];
		$consultation = $article["consultation"];		
		$nom_collectivite = $article["nom_collectivite"];
		$datelimite = $article["datelimite"];
		$nom_procedure = $article["nom_procedure"];
		
		
		$page .= "<tr>
		<td><a href=\"$link\">$reference</a></td>
		<td><a href=\"$link\">$title</a></td>
		<td><a href=\"$link\">$nom_nature</a></td>
		<td><a href=\"$link\">$nom_collectivite</a></td>
		<td><a href=\"$link\">$datelimite</a></td>
		<td><a href=\"$link\">$nom_procedure</a></td>
		
		</tr>";

Re: Filtrer un tableau en fonction d'une valeur

par moogli » 27 août 2013, 20:03

qu'as tu testé ?

montre nous le code, (juste le tri pas le reste ;) ).


@+

Re: Filtrer un tableau en fonction d'une valeur

par machachoune » 27 août 2013, 12:29

Bonjour moogli,

Je te remercie pour ton conseil. Je vais enlever global. Le tableau de données doit comporter 6 colonnes avec les informations suivantes :

Référence - Intitulé - Type - Service - Date de remise - Procédure

J'arrive à récupèrer les données à partir du flux rss en sélectionnant dans l'arbre les tags nécessaires au parcours et à l'affichage du tableau. Seulement dans la balise <nature></nature> j'ai l'élément enfant <nom_nature></nom_nature> qui ne possède pas d'attribut et peut prendre 3 valeurs : Fournitures, Travaux et Services. Ce qu'il me faudrait c'est un affichage du tableau en fonction d'un retour d'un tri. Par exemple, je veux afficher mon tableau uniquement sur le critères Fournitures. J'ai essayé la fonction array_multisort, sans rien arrivé à faire. Mais j'avoue que je suis pas très douée.

Merci beaucoup pour votre aide.

Re: Filtrer un tableau en fonction d'une valeur

par moogli » 27 août 2013, 10:40

Salut,

Première chose le global c'est le mal :mrgreen:
Pêne a la maintenance du script et au problème que cela peux générer. Et tu commence avec une tu finiras avec 40 variables globales qui sortent de nul part (vécu ;) ).

Ensuite il nous faut un exemple du tableau de données et ce une tu veux au final, le reste de la tambouille est accessoire ;)

Dans cas, si j'ai bien compris c'est la fonction array_multisort qui te convient pour trier un tableau multi dimensionnel.

Les fonction de tri en php

@+

Filtrer un tableau en fonction d'une valeur

par Zaza » 27 août 2013, 01:40

Bonsoir,

Je viens vers vous car cela fait maintenant plusieurs jours que je n'arrive pas à résoudre mon soucis. Je souhaiterais afficher un tableau en fonction d'une valeur contenue dans une cellule. Je n'ai pas accès à la base de données, je reçois un flux rss que je dois parser puis trier en fonction de la valeur contenu dans le tag "nom_nature". Celle-ci qui peut avoir trois valeurs différentes.

J'ai utilisé rsslib pour parser le flux rss, que j'ai adapté pour les besoins de mises en forme et l'affichage du tableau. La fonction RSS_Display() est celle qui appelée dans la page d'affichage. J'ai tenté les fonctions array_filter(), array_search(),... et d'autres mais rien n'y fait. Votre aide est préconisée et je vous en remercie par avance.

Voici le code que j'utilise :

$RSS_Content = array();

function RSS_Tags($item, $type)
{
		$y = array();
		$tnl = $item->getElementsByTagName("title");
		$tnl = $tnl->item(0);
		$title = $tnl->firstChild->textContent;

		$tnl = $item->getElementsByTagName("link");
		$tnl = $tnl->item(0);
		$link = $tnl->firstChild->textContent;

		$tnl = $item->getElementsByTagName("description");
		$tnl = $tnl->item(0);
		$description = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("reference");
		$tnl = $tnl->item(0);
		$reference = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("consultation");
		$tnl = $tnl->item(0);
		$consultation = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("nom_nature");
		$tnl = $tnl->item(0);
		$nom_nature = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("nom_collectivite");
		$tnl = $tnl->item(0);
		$nom_collectivite = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("datelimite");
		$tnl = $tnl->item(0);
		$datelimite = $tnl->firstChild->textContent;
		
		$tnl = $item->getElementsByTagName("nom_procedure");
		$tnl = $tnl->item(0);
		$nom_procedure = $tnl->firstChild->textContent;
		
	
		$y["title"] = $title;
		$y["link"] = $link;
		$y["description"] = $description;
		$y["reference"] = $reference;
		$y["consultation"] = $consultation;
		$y["nom_nature"] = $nom_nature;
		$y["nom_collectivite"] = $nom_collectivite;
		$y["datelimite"] = $datelimite;
		$y["nom_procedure"] = $nom_procedure;
		$y["type"] = $type;
		
		return $y;		
}

function RSS_Channel($channel)
{
	global $RSS_Content;

	$items = $channel->getElementsByTagName("item");
	
	// Processing channel
	
	$y = RSS_Tags($channel, 0);		// get description of channel, type 0
	array_push($RSS_Content, $y);
	
	// Processing articles
	
	foreach($items as $item)
	{
		$y = RSS_Tags($item, 1);	// get description of article, type 1
		array_push($RSS_Content, $y);
	}
}

function RSS_Retrieve($url)
{
	global $RSS_Content;

	$doc  = new DOMDocument();
	$doc->load($url);

	$channels = $doc->getElementsByTagName("channel");
	
	$RSS_Content = array();	
	foreach($channels as $channel)
	{
		 RSS_Channel($channel);
	}
	
}

function RSS_RetrieveLinks($url)
{
	global $RSS_Content;

	$doc  = new DOMDocument();
	$doc->load($url);

	$channels = $doc->getElementsByTagName("channel");
	
	$RSS_Content = array();
	
	foreach($channels as $channel)
	{
		$items = $channel->getElementsByTagName("item");
		foreach($items as $item)
		{
			$y = RSS_Tags($item, 1);	// get description of article, type 1
			array_push($RSS_Content, $y);
		}		 
	}
}

function RSS_Links($url, $size = 15)
{
	global $RSS_Content;

	$page = "<table width='700' border='1'>
	<tr>
	<td class='rose'>Référence</td>
	<td>Intitulé</td>
	<td>Type de marché</td>
	<td>Service</td>
	<td>Date limite de remise des plis</td>
	<td>Type de procédure</td>
	</tr>";

	RSS_RetrieveLinks($url);
	if($size > 0)
		$recents = array_slice($RSS_Content, 0, $size + 1);

	foreach($recents as $article)
	{
		$type = $article["type"];
		if($type == 0) continue;
		$title = $article["title"];
		$link = $article["link"];
		$consultation = $article["consultation"];
		$nom_nature = $article["nom_nature"];
		
		
		$page .= "<td><a href=\"$link\"><br></td><td>$title</a>$consultation</td>\n";			
	}

	$page .="</tr></table>\n";

	return $page;
	
}

function fourniture($tri){
	if ($tri=="Fournitures"){
	return true;
	}
	return false;
}


function RSS_Display($url, $size = 0, $site = 0)
{
	global $RSS_Content;

	$opened = false;
	$page = "";
	$site = (intval($site) == 0) ? 1 : 0;

	$y["nom_nature"]= "Fournitures";
	RSS_Retrieve($url);
	if($size > 0)
	
	$recents = array_slice($RSS_Content, $site, $size + 1 - $site);
	$tri = array_filter($y, 'fourniture');
	
	foreach($recents as $article)
	{
		$type = $article["type"] ;	

		if($type == 0)
		{
			if($opened == true)
			{
				$page .="</ul>\n";
				$opened = false;
			}
			$page .="<b>";
		}
		else
		{
			if($opened == false)
			
			{
				$page .= "<table width='700' cellpadding='0' cellspacing='0'>
				<tr>
				<td class='bleu'>Reference</td>
				<td class='bleu'>Intitule</td>
				<td class='bleu'>Type de marche</td>
				<td class='bleu'>Service</td>
				<td class='bleu'>Date limite de remise des plis</td>
				<td class='bleu'>Type de procedure</td>
				</tr>";
				$opened = true;
			}
		}


		$title = $article["title"];
		$link = $article["link"];
		$description = $article["description"];
		$reference = $article["reference"];
		$nom_nature = $article["nom_nature"];
		$consultation = $article["consultation"];		
		$nom_collectivite = $article["nom_collectivite"];
		$datelimite = $article["datelimite"];
		$nom_procedure = $article["nom_procedure"];
		
		
		$page .= "<tr>
		<td><a href=\"$link\">$reference</a></td>
		<td><a href=\"$link\">$title</a></td>
		<td><a href=\"$link\">$nom_nature</a></td>
		<td><a href=\"$link\">$nom_collectivite</a></td>
		<td><a href=\"$link\">$datelimite</a></td>
		<td><a href=\"$link\">$nom_procedure</a></td>
		
		</tr>";
		if($description != false)
	
		{
			$page .= "";
		}
		$page .= "\n";			
		
		if($type==0)
		{
			$page .="</b><br /></tr>";
		}

	}

	if($opened == true)
	{	
		$page .="</tr></table>\n";
	}
	
	if($opened == false)
	{	
		$page .="<h1>Il n'y a pas actuellement de consultation RFI</h1><br /><br /><br /><br />\n";
	}
	
	
	return $page."\n";
	
}


?>