Zur Navigation

Alternative zu array_intersect [2]

11 AndiN

Okay, anbei der komplette Code:

Array-Definition
$array_ausstattung1 = array();
$array_ausstattung2 = array();
$array_ausstattung3 = array();

Generierung von $array_alles (funktioniert!)
$sql = mysql_connect($host,$user,$pword);
mysql_select_db($db,$sql);
$query = "
SELECT DISTINCTROW
	domizile.ID DomizilID,
	domizile.Region,
	objekte.ID ObjektID,
	objekte.Personen1,
	objekte.Typ
FROM objekte
	LEFT JOIN domizile ON objekte.DomizilID = domizile.ID
WHERE objekte.Astagionepreis > 0 && objekte.Mstagionepreis > 0 && objekte.Bstagionepreis > 0 && objekte.Offline != 'x'
GROUP BY objekte.ID";
$result = @mysql_query($query) or die("8".mysql_error());
while($val = mysql_fetch_array($result))
{
	$Domizil_ID = $val[0];
	$Domizil_Region = $val[1];
	$Objekt_ID = $val[2];
	$Objekt_Personen1 = $val[3];
	$Objekt_Typ = $val[4];

	if(isset($_REQUEST['regionen']))
	{
		foreach($_REQUEST['regionen'] as $v)
		{
			if($v == $Domizil_Region)
			{
				if(isset($_REQUEST['objekttyp']))
				{
					foreach($_REQUEST['objekttyp'] as $v)
					{
						if($v == $Objekt_Typ)
						{
							if($_REQUEST['personenanzahl'] < 1 || $_REQUEST['personenanzahl'] == $Objekt_Personen1)
								$array_alles[] = $Objekt_ID;
						}
					}
				}
				else
					$array_alles[] = "";
			}
		}
	}
	else
		$array_alles[] = "";

Generierung der Ausstattungs-Arrays (funktioniert!)
	if($_REQUEST['ausstattung'][0] !="")
	{
		$sql1 = mysql_connect($host,$user,$pword);
		mysql_select_db($db,$sql1);
		$query1 = "SELECT AttributID FROM objektattribute_allgemein WHERE ObjektID = ".$Objekt_ID;
		$result1 = @mysql_query($query1) or die("9".mysql_error());
		while($val1 = mysql_fetch_array($result1))
		{
			if(in_array($val1[0],$_REQUEST['ausstattung']))
				$array_ausstattung1[] = $Objekt_ID;
		}

		$sql2 = mysql_connect($host,$user,$pword);
		mysql_select_db($db,$sql2);
		$query2 = "SELECT AttributID FROM objektattribute_badezimmer WHERE ObjektID = ".$Objekt_ID;
		$result2 = @mysql_query($query2) or die("10".mysql_error());
		while($val2 = mysql_fetch_array($result2))
		{
			if(in_array($val2[0],$_REQUEST['ausstattung']))
				$array_ausstattung2[] = $Objekt_ID;
		}
		$sql3 = mysql_connect($host,$user,$pword);
		mysql_select_db($db,$sql3);
		$query3 = "SELECT AttributID FROM objektattribute_kueche WHERE ObjektID = ".$Objekt_ID;
		$result3 = @mysql_query($query3) or die("11".mysql_error());
		while($val3 = mysql_fetch_array($result3))
		{
			if(in_array($val3[0],$_REQUEST['ausstattung']))
				$array_ausstattung3[] = $Objekt_ID;
		}
	}
}

Wenn Ausstattungsmerkmale über das Suchformular ankommen dann...
	
if($_REQUEST['ausstattung'][0] !="")
{
	$kb = array('array_alles','array_ausstattung1','array_ausstattung2','array_ausstattung3');
	$array_suchergebnisIDs = $array_alles;
	foreach($kb as $k)
	{
		if(!empty(${$k}))
			$array_suchergebnisIDs = array_intersect($array_suchergebnisIDs,${$k});
	}
}
else
	$array_suchergebnisIDs = $array_alles;

Ausgabe:
return $array_suchergebnisIDs;

In echt sind es 7 Ausstattungsmerkmale-Arrays. Ich habe es jetzt auf 4 reduziert da die alle nach dem selben Prinzip generiert werden. Sämtliche Arrays werden auch korrekt generiert und mit korrekten IDs befüllt. Ist evtl. so etwas schwierig nachvollziehbar. Es handelt sich bei allen Arays um eindimensionale Arrays. Am Ende soll ein Array entstehen welches nur noch Einträge beinhaltet die in allen Arrays vorkommen. Das $array_alles kann nie leer sein. Eines oder mehrere der Ausstattungs-Arrays allerdings schon.

20.06.2012 16:23

12 Rudy

Sorry ich habe mich wohl unklar ausgedrückt, die Datenbankabfragen sind ohne entsprechende Datenbank nur für Dich verwendbar. Eine print_r-Ausgabe von $array_alles und $array_ausstattung1 - x und das gewünschte $array_suchergebnisIDs würden reichen.

Was mir allerdings in Deinem Code auffällt, Du machst für jede Query eine neue Datenbankverbindung, das ist nicht notwendig. Einmal am Anfang reicht, verwende dann immer das gleiche $conn (außer Du hast wirklich mehrere verschiedene Datenbanken)

$conn = mysql_connect($host,$user,$pword);
mysql_select_db($db,$conn);

...

$res1 = mysql_query(..., $conn);
...
$res2 = mysql_query(..., $conn);

20.06.2012 16:29

13 AndiN

Achso, okay...

Beispiel:
if($_REQUEST['ausstattung'][0] !="")
{
	$kb = array('array_alles','array_ausstattung1','array_ausstattung2','array_ausstattung3','array_ausstattung4','array_ausstattung5','array_ausstattung6','array_ausstattung7');
	$array_suchergebnisIDs = $array_alles;
	foreach($kb as $k)
	{
		if(!empty(${$k}))
			$array_suchergebnisIDs = array_intersect($array_suchergebnisIDs,${$k});
	}
/*
	for ($i=1,$array_suchergebnisIDs=$array_alles; $i<6 && ($arr =& ${'array_ausstattung'.$i}); $i++)
	{
		if (isset($arr) && !empty($arr))
			$array_suchergebnisIDs = array_intersect($array_suchergebnisIDs, $arr);
	}
*/
}
else
	$array_suchergebnisIDs = $array_alles;
			
	print_r($array_alles);
	print_r($array_ausstattung1);
	print_r($array_ausstattung2);
	print_r($array_ausstattung3);
	print_r($array_ausstattung4);
	print_r($array_ausstattung5);
	print_r($array_ausstattung6);
	print_r($array_ausstattung7);
	print_r($array_suchergebnisIDs);

Ausgabe:
Array
(
    [0] => 14
    [1] => 20
    [2] => 21
    [3] => 27
    [4] => 40
    [5] => 55
    [6] => 56
    [7] => 57
    [8] => 58
    [9] => 61
    [10] => 87
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 9
    [1] => 10
    [2] => 13
    [3] => 14
    [4] => 15
    [5] => 16
    [6] => 17
    [7] => 17
    [8] => 17
    [9] => 18
    [10] => 18
    [11] => 18
    [12] => 19
    [13] => 19
    [14] => 19
    [15] => 20
    [16] => 20
    [17] => 20
    [18] => 21
    [19] => 21
    [20] => 21
    [21] => 22
    [22] => 22
    [23] => 22
    [24] => 23
    [25] => 23
    [26] => 24
    [27] => 24
    [28] => 25
    [29] => 25
    [30] => 26
    [31] => 26
    [32] => 27
    [33] => 27
    [34] => 28
    [35] => 28
    [36] => 29
    [37] => 29
    [38] => 30
    [39] => 30
    [40] => 31
    [41] => 31
    [42] => 40
    [43] => 40
)
Array
(
    [0] => 14
    [1] => 20
    [2] => 21
    [3] => 27
    [4] => 40
)

Richtig wäre jedoch laut Ausgabe:
Array
(
    [0] => 20
    [1] => 21
)

Hier stimmt irgendwie etwas bei der Array-Generierung noch nicht. Da sind zu viele Arrays leer die eigentlich nicht leer sein sollten. Da muss ich nochmal ran.

20.06.2012 16:52

14 Jörg Kruse

Den Angaben in Beitrag 13 zufolge wird die Schnittmenge korrekt ausgegeben. $array_suchergebnisIDs enthält alle Elemente, die in den beiden nicht-leeren Arrays $array_alles und $array_ausstattung7 vorkommen

20.06.2012 17:18

15 AndiN

Das stimt, ja. Aber laut der Datenbank sollte das Ergebnis anders lauten. D.h. da ist wohl noch was falsch.

20.06.2012 17:26

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]