Hallo,
ich muss leider mal wieder was fragen.
Gibt es eine simple Funktion die ein Array das mit array_count_values bearbeitet
wurde, wieder rückgängig macht bzw. man irgendwie anders die Werte austauschen
kann?
array_flip() habe ich schon ausprobiert, sieht man auch nochmal unten im Code, funktioniert
aber nicht mit der Array Struktur.
--> Warning: array_flip() [function.array-flip]: Can only flip STRING
and INTEGER values! in ...
Ebenfalls habe ich auch schon folgendes getestet -->
PHP-Code:
$tmp = array_count_values($array);
$array2 = array();
foreach( $tmp as $key => $value ) {
$array2[] = array($key, $value);
}
Jedoch kann ich damit nichts anfangen da eine spätere Bearbeitung des Arrays
so wie ich das benötige nicht mehr möglich ist. Zumindestens habe ich noch keine passende Lösung gefunden,
falls das doch gehen sollte.
Denn im nachfolgenden Code, ermittel ich den höchsten bzw. geringsten Wert
und lösche anhand dieser Information teile des Arrays.
Wenn ich den soeben genannten Code verwende, löscht er mir die Arrayschlüssel
aber nicht die z.B. geringste Menge an Inhalt.
Folgendes will ich erreichen.
Ich habe zwei Tabellen in m:n Format.
z.B.
Genre:
ID genre
1 Rock
2 Electro
3 Pop
4 Alternative
5 Punk
6 Country
Release
g_genre g_release (id der Release)
1 104
2 110
2 50
3 67
3 110
4 65
So nun möchte ich z.B. ID 110 vergleichen.
Wie man sieht hat sie zwei Genre --> 2 und 5.
Ich habe dies aus der Datenbank geholt und sortiert so das Genre 2 und 5
angezeigt wird.
Nun sollen aber die restlichen Genre 1,3,4 und 6 ebenfalls rausgeholt werden und
extra angezeigt werden. (diese stehen später als Auswahl zur Verfügung)
Da ich das nach längerem Versuchen nicht mit Mysql lösen konnte, da z.B.
folgender Code...
PHP-Code:
$sql_genre = "SELECT * FROM genre_release as parent
LEFT JOIN (
SELECT * FROM genre_small
)as child
ON ( parent.g_genre <> child.id )
WHERE g_release = $id
ORDER BY child.genre ASC
";
....nach einander die Abfragen bearbeitet und somit einmal genre id 2 nimmt
und die restlichen 1,3,4,5,6 ausgibt und dann genre id 5 nimmt und 1,2,3,4,6
ausgibt. Dadurch habe ich jedoch statt gewünschten 4 IDs 10.
Wie ich eine doppelte Abfrage verhindern kann, konnte ich nicht herausfinden.
Ich habe mir dann wie folgt geholfen. Ich habe alles in ein Array gepackt und
dieses Array dann nach Anzahl der Inhalte gezählt. Habe danach die Häufigkeit
der Werte im Array ausgelesen.
--> Da die Genre 2 und 5 die ich nicht brauche ja nur einmal vorkommen, habe
ich jedes Genre was am wenigstens vorkommt entfernen lassen.
Ohne array_count_values wäre dies aber nicht möglich gewesen. Da ich nicht
an die Werte gekommen wäre.
Jetzt nach dem ich dann alles mühsam zusammenschustern wollte habe ich kurz
vorm Ende bemerkt dass ich mit dem Array das array_count_values erzeugt hat,
nix anfangen kann.
Denn dieses kann ich nicht wie z.B. gewünscht mit
$array[0] ausgeben. Wollte auch schon array_flip nutzen, damit ich einfach
die Schlüssel mit den Wert tausche aber auch das ging nicht.
Fehlermeldung (s. oben).
Habe schon bissel was probiert, aber hat nichts gefruchtet. Habt ihr vllt.
eine Idee wie ich das lösen kann? Oder gibt es notfalls irgendeinen anderen
simpleren Weg auf den ich nicht gekommen bin. --> am ende vllt. doch mit Mysql.
Würde mich über Tipps oder ähnliches sehr freuen.
PHP-Code:
$zahl_r = 0;
$genre_r_array = array();
$id= $_GET['seite'];
$sql_genre = "SELECT * FROM genre_release as parent
LEFT JOIN (
SELECT * FROM genre_small
)as child
ON ( parent.g_genre = child.id )
WHERE g_release = $id
ORDER BY child.genre ASC
";
// ON ( parent.g_genre <> child.id ) Ungleich
$sql_genre2 = mysql_query($sql_genre);
while ($inhalt_genre = mysql_fetch_array($sql_genre2)){
$genre_right = $inhalt_genre['genre'];
$genre_id = $inhalt_genre['id'];
//global $listbox_right;
echo "<option value='".$genre_id."'>".$genre_right."</option>";
foreach($inhalt_genre AS $key => $value)
$inhalt_r[$zahl_r][$key] = $value;
//Speichert hier das Ergebnis wieder in ein Array damit
//das neue Array
// mit ihn die andere While-Schleife nach dem }
// genommen werden kann
$genre_r_array[] = $inhalt_r[$zahl_r][$key];
echo $inhalt_r[$zahl_r][$key];
echo "<br/>";
$zahl_r++;
}
///// Hier wird die linke Listbox gefüllt mit den restl.
//Genre die nicht gewählt sind
//print_r ($inhalt_genre['id']);
// $id_zahl = 0;
// for( $id_zahl = 0; $id_zahl < count ($inhalt_genre['id']); $id_zahl++){
$a_genre_id = $inhalt_genre['id'];
$zahl_l = 0;
$zahl_a = 0;
$array = array();
$sql_listbox_left = "SELECT *
FROM genre_small
";
$sql_listbox_left2 = mysql_query($sql_listbox_left);
while ($inhalt_genre_left = mysql_fetch_array($sql_listbox_left2)){
///// Speichert die DB Ausgabe in ein mehrdemmensionales Array
///// da sonst doppelte Inhalte entstehen
foreach($inhalt_genre_left AS $key => $value)
$inhalt_l[$zahl_l][$key] = $value;
//Überprüft das Array was in der ersten DB Abfrage erstellt wurde
// wieviel Daten vorhanden sind, damit wird dann auch ein
//Array Schlüssel haben z.B. $genre_r_array[2]
$anzahl = count($genre_r_array);
// kleiner $anzahl da Array ab 0 beginnt und Anzahl ja
//nicht die 0 mit gezählt hat
// somit wäre es eins zuviel
for($x=0;$x<$anzahl;$x++) {
if ($genre_r_array[$x] != $inhalt_l[$zahl_l][$key] ) {
$array[] = $inhalt_l[$zahl_l][$key];
//$array = array_unique($array);
//print_r ($result);
}
//echo $x;
}
echo "<br/>";
// echo $inhalt_l[$zahl_l][$key];
echo "<br/>";
$zahl_l++;
//$result = array_unique($array);
$all_genre_name = $inhalt_genre_left['genre'];
$all_genre_id = $inhalt_genre_left['id'];
}
//echo $array[6];
$ausgabe = array();
//array_count_values zählt wie oft die genre vorkommen
//damit ich dann die höchste Anzahl lassen kann
$array2 = array_count_values($array);
// Dieser Befehl würde das Array in seiner Form behalten
//jedoch kann ich damit
// nicht mehr zählen, den geringsten und höchsten Wert
//definieren etc.
/*
$tmp = array_count_values($array);
$array2 = array();
foreach( $tmp as $key => $value ) {
$array2[] = array($key, $value);
} */
// Hier wird die Anzahl der Inhalte des Arrays ermittelt,
//damit wir unten dann wissen
// wieviel index Schlüssel existieren fürs Array zum
//auslesen, somit können wir auch Genre hinzufügen
$array_groesse = count($array2);
asort($array2);
$klzahl = min($array2);
//print_r ($klzahl);
$i = 0;
print_r($ergebnis_array);
// unset löscht den gewünschten Wert 1 den ich vorher erst suche
// da array_search immer nur 1x was ausgibt, muss die Anweisung mehrmals
// durchgeführt werden, sonst würde nur einmal die 1 gelöscht.
$count = 1;
$i = 0;
while($count <= $array_groesse){
unset($array2[array_search($klzahl, $array2)]);
$count++;
}
$count = 0;
$array_groesse2 = count($array2);
while($count <= $array_groesse2){
//echo $array2;
$count++;
}
$trans = array($array2);
$trans = array_flip($trans);
print_r($trans);
//echo $array2['0'];
// print_r($array2);
//$key = array_search($grzahl, $array2);
//echo $key;
}
}