array_key_filter - Filtrer simplement un tableau sur ses colonnes (array)

admin janvier 8th, 2009

Voici une fonction qui permet avec une logique identique au Sql de filtrer les données d’un tableau sur des colonnes, et aussi donc de filtrer un résultat Sql.

Pour par exemple filtrer une liste de produit sur la taille, la couleur, le prix, tout critère disponible dans le tableau passer par ce genre de fonction soulage le serveur sql d’une requête par utilisateur.

Comment cela fonctionne :

1 - Un tableau de donnée avec de colonnes

$db_produit=array();
 
$db_produit[0]["codebar"]="111111";
$db_produit[0]["listestailles"]=array("M","XL");
$db_produit[0]["listescouleurs"]=array("Rouge","vert");
$db_produit[0]["prix"]=30;
$db_produit[0]["prix_remise"]=5;
 
$db_produit[1]["codebar"]="1122211";
$db_produit[1]["listestailles"]=array("M","L","S");
$db_produit[1]["listescouleurs"]=array("bleu","vert");
$db_produit[1]["prix"]=150;
$db_produit[1]["prix_remise"]=120;
 
//etc...

Les critères de filtrage des données :

$critere_restriction=array();
$critere_restriction["affichetaille"]=45;
$critere_restriction["affichecouleur"]="bleu";
$critere_restriction["prixmin"]=10;
$critere_restriction["prixmax"]=30;
 
if (count($critere_restriction)>0)
{
	// Restreint l'affichage des produits aux produits selectionnes
	$callback_func = create_function('$db_produit , $critere_restriction','
	if (
 
	( ($critere_restriction["affichetaille"]!="" &&
in_array($critere_restriction["affichetaille"],(array)$db_produit["listestailles"]))
|| $critere_restriction["affichetaille"]=="" )
 
	&&
 
	( ($critere_restriction["affichecouleur"]!="" &&
in_array($critere_restriction["affichecouleur"],(array)$db_produit["listescouleurs"]))
|| $critere_restriction["affichecouleur"]=="" )
 
	&&
 
	( (
	is_numeric($critere_restriction["prixmax"]) &&
is_numeric($critere_restriction["prixmin"])
	&&
	(
	(
	$db_produit["prix"]<=$critere_restriction["prixmax"] &&
$db_produit["prix"]>=$critere_restriction["prixmin"]
	)
	||
	(
	$db_produit["prix_remise"]!=-1 && is_numeric($db_produit["prix_remise"]) &&
$db_produit["prix_remise"]<=$critere_restriction["prixmax"] &&
$db_produit["prix_remise"]>=$critere_restriction["prixmin"]
	)
	)
 
	|| $critere_restriction["prixmin"]==""
	)
	)
 
	)
	{return true;}
	');
 
	// Filtre la base
	$db_produit=array_key_filter($db_produit,$critere_restriction,$callback_func);
	unset($critere_restriction);
	$nombre_total_de_resultat=count($db_produit);
}

La partie qui permet de faire les conditions de filtrage est celle ci. Vous faites simplement une condition qui répond à votre besoin.
Dans cette condition on retourne le résultat de la ligne du tableau si elle correspond à un des critères demandé :

				if (
 
				( ($critere_restriction["affichetaille"]!="" &&
in_array($critere_restriction["affichetaille"],(array)$db_produit["listestailles"]))
|| $critere_restriction["affichetaille"]=="" )
 
				&&
 
				( ($critere_restriction["affichecouleur"]!="" &&
in_array($critere_restriction["affichecouleur"],(array)$db_produit["listescouleurs"]))
|| $critere_restriction["affichecouleur"]=="" )
 
				&&
 
				( (
				is_numeric($critere_restriction["prixmax"]) &&
is_numeric($critere_restriction["prixmin"])
				&&
				(
				(
				$db_produit["prix"]<=$critere_restriction["prixmax"] &&
$db_produit["prix"]>=$critere_restriction["prixmin"]
				)
				||
				(
				$db_produit["prix_remise"]!=-1 && is_numeric($db_produit["prix_remise"]) &&
$db_produit["prix_remise"]<=$critere_restriction["prixmax"] &&
$db_produit["prix_remise"]>=$critere_restriction["prixmin"]
				)
				)
 
				|| $critere_restriction["prixmin"]==""
				)
				)
 
				)
				{return true;}

Voici la fonction de filtrage :

// # array_key_filter ###################################################
// # Permet de filtrer un tableau sur ses colonnes
// # Retour : tableau filtre
function array_key_filter($array,$criteres_restriction=array(),$callback)
{
	$ret = array();
	foreach($array as $key_recherche=>$array_resultat_page)
	{
		if ($callback($array_resultat_page,$criteres_restriction))
		{
			$ret[]=$array_resultat_page;
		}
	}
	return $ret;
}

Comments are closed.

Trackback URI |