2 Arrays miteinander vergleichen

psifactory

Erfahrenes Mitglied
Hallo,

folgende Problematik:

ich habe 2 Arrays. Diese sind wie folgt aufgebaut:

$gaeste
Code:
Array
(
    [0] => stdClass Object
        (
            [va_id] => 34
            [gaeste_gesamt] => 165
        )

    [1] => stdClass Object
        (
            [va_id] => 42
            [gaeste_gesamt] => 168
        )
.....

$umsaetze
Code:
Array
(
    [0] => stdClass Object
        (
            [va_id] => 34
            [umsatzsumme] => 1994.29
        )

    [1] => stdClass Object
        (
            [va_id] => 35
            [umsatzsumme] => 28.1
        )
...

Ich muss jetzt mit diesen Rechnen, aber nur wenn die va_id bei beiden identisch ist.

(umsatzsumme / gaeste_gesamt)

Hab schon einiges probiert mit diversen schleifen usw. aber irgendwie komm ich zu keinem richtigen ergebniss. Wie sollte ich hier dann am Besten an die Problematik rangehen?
 
Hab die Versuche leider schon wieder gelöscht weil ich vermute, dass ich auf dem falschen Weg da rangegangen bin.

Mein Versuch war es per "doppelter" Schleife Beide Arrays durchzuzählen und bei Übereinstimmung beider Werte die Rechnung auszuführen.

In etwa so:

PHP:
for .... $gaeste
{
    for .... $umsaetze
    {
         if $umsaetze[va_id] == $gaeste [va_id]
         {
            RECHNUNG
         }
    }
}

Wäre diese Herangehensweise die Richtige? Falls ja würde ich das nochmal ausarbeiten und mich bei Bedarf noch mal rühren.

LG
 
Hier mal noch mein aktuell umgesetzter Versuch. Allerdings bekomme ich hier folgende Fehlermeldung:


Notice: Use of undefined constant va_id - assumed 'va_id' in C:\xampp\***\ausgabe.tpl.php on line 62

Fatal error: Cannot use object of type stdClass as array in C:\xampp\***\ausgabe.tpl.php on line 62

PHP:
for ($u=0;$u < sizeof($umsaetze); $u++)
{
	for ($g=0;$g < sizeof($gaeste); $g++)
	{
		if ($umsaetze[$u][va_id] == $gaeste[$g][va_id])
		{
			echo "check! ";
		}
	}
}

Line 62 bezieht sich auf die if anweisung...
 
Haben denn beide Arrays die zueinander zugehörigen Daten am gleichen Index?
Sprich dass $gaeste[n] auch zu $umsaetze[n] gehört?

Wenn ja, dann brauchst du nur eine Schleife für ein der beiden Arrays.
 
Also es scheint ja an der IF Anweisung zu liegen. Ein Array kann ich doch so wie hier ansprechen oder?

$gaeste[$g][va_id]

Zur Erinnerung der Inhalt von $gaeste:

Code:
Array
(
    [0] => stdClass Object
        (
            [va_id] => 34
            [gaeste_gesamt] => 165
        )
...
 
Jein, also du kannst es, aber du solltest nicht. Array-Indizes spricht man entweder mit Integer-Werten oder Zeichenketten an, aber nicht mit Konstanten (also wenn die Konstanten nicht definiert wurden). Das Problem besteht hierin:
PHP:
$a = array(
  'foo' => 'bar',
  'bar' => 'foo',
);

echo $array[foo]; # gibt "bar" aus
define('foor', 'bar');
echo $array[foo]; # gibt "foo" aus
Du solltest also folgendes verwenden:
PHP:
$gaeste[$g]['va_id'];
Außerdem sind die Elemente in deinem Array Objekte, auf die du die Funktion sizeof nicht anwenden kannst, da sonst folgende Nachricht erscheint:
Fatal error: Cannot use object of type stdClass as array in C:\xampp\***\ausgabe.tpl.php on line 62
 
Hi,

ich weiß nicht, was genau berechnet werden soll. Da es dir aber nur um die Machbarkeit zu gehen scheint, hier mal ein kleiner Anwendungsfall:

PHP:
<?php
function combine(array $umsaetze, array $gaeste)
{
  $combined = array();
  
  foreach($umsaetze as $umsatz)
  {
    foreach($gaeste as $gast)
    {
      if($umsatz->va_id == $gast->va_id)
      {
        $gast_umsatz = new stdClass();
        $gast_umsatz->va_id = $umsatz->va_id;
        $gast_umsatz->umsatzsumme = $umsatz->umsatzsumme;
        $gast_umsatz->gaeste_gesamt = $gast->gaeste_gesamt;
        $combined[] = $gast_umsatz;
      }
    }
  }
  
  return $combined;
}

function calc(array $gaeste_umsaetze)
{
  foreach($gaeste_umsaetze as $gast_umsatz)
  {
    $pro_gast = $gast_umsatz->umsatzsumme / $gast_umsatz->gaeste_gesamt;
    
    echo "VA-ID: " . $gast_umsatz->va_id . " => Umsatz pro Gast = " . sprintf("%1.2f", $pro_gast);
  }
}

$o1 = new stdClass();
$o1->va_id = 34;
$o1->gaeste_gesamt = 165;

$o2 = new stdClass();
$o2->va_id = 42;
$o2->gaeste_gesamt = 168;

$gaeste = array();
$gaeste[] = $o1;
$gaeste[] = $o2;

$p1 = new stdClass();
$p1->va_id = 34;
$p1->umsatzsumme = 1994.29;

$p2 = new stdClass();
$p2->va_id = 35;
$p2->umsatzsumme = 28.1;

$umsaetze = array();
$umsaetze[] = $p1;
$umsaetze[] = $p2;

var_dump($gaeste);
var_dump($umsaetze);

$gaeste_umsaetze = combine($umsaetze, $gaeste);
calc($gaeste_umsaetze);

Bestimmt geht das auch noch eleganter, aber es funktioniert zuverlässig.
 
Es geht auch ohne 10'000 Schleifen

PHP:
// Die 2 gewünschten Werte in eingene Arrays extrahieren
$gaesteGesamt = array_extract_sub_item($gaeste, 'gaeste_gesamt', 'va_id');
$umsatzSummen = array_extract_sub_item($umsaetze, 'umsatzsumme', 'va_id');

// Schlüsselvergleich und extrahieren
$index = array_keys(array_intersect_key($gaesteGesamt, $umsatzSummen));

// Alle mit gemeinsamen Schlüssel berechnen
$result = array();
foreach($index as $key){
    $result[$key] = $umsatzSummen[$key]/$gaesteGesamt[$key];
}

//Resultat ausgeben
var_dump($result);


/**
 * Extrahieren ein Subitem aus einem mehrstufigen Array. Der Schlüssel wird beibehalten
 * @param   Array<Key => Array<Node>>   Ein mehrstufiger Array
 * @param   String                      Schlüssel des zu extrahierenden Item
 * @param   Optional String             Name des Indexfeldes
 * @return  Array<Key => Node>
 */
function array_extract_sub_item($array, $itemKey, $keyKey = false){
    $retArray = array();
    foreach($array as $index => $item){
        // ggf Objekte in Array konvertieren
        $item = (array) $item;
        // Bestimmen was der neue Index ist
        if($keyKey !== false) $index = $item[$keyKey];
        // Wert mit entsprechendem abfüllen
        $retArray[$index] = $item[$itemKey];        
    }
    return $retArray;
}
 
Zurück