mehrdimensionales array, key finden

wenn doch so oder?

PHP:
$itemIds = array_column($_SESSION['inventar'], 'Item_ID');
foreach($zufall_items as $idx => $zufallsItem){
    if(in_array($zufallsItem, $itemIds)){
        $_SESSION['inventar'][$idx]['Anzahl']++;
    }else{
        $_SESSION['inventar'][] = array('Item_ID' => $zufallsItem, 'Anzahl' => 1, 'Level' => 0);
    }
}
 
habe ich auch probiert.
hier mal die Testseite.
Einfach mal die Seite immer neu laden lassen, wirklich richtig wird die neue Session nicht angepasst: http://m.it-neuss.de/test/

Hier der ganze Code:
Code:
<?php
header('Content-Type: text/html; charset=utf-8');
ini_set('session.use_cookies',1);
ini_set('session.use_only_cookies',1);
ini_set('session.use_trans_sid',0);
session_start();


error_reporting(-1);
ini_set('display_errors', true);  /* Alle Fehlermeldungen anziegen lassen. Im "Echtbetrieb" auf "false" setzen! */


include('config.php');   




$sql = 'SELECT * FROM `user` WHERE `ID` = "1"'; 
$ergebnis = $db->query( $sql );
                           
if ($ergebnis->num_rows != 0)
    {
        while ($zeile = $ergebnis->fetch_object())
            {
                $inventar_array = json_decode($zeile->inventar, true);
                $_SESSION['inventar']                                    =        $inventar_array;
            }
    }
echo "BESTEHENDES SESSION INVENTAR<br />";
                                echo '<pre>';
                                print_r($_SESSION['inventar']);
                                echo '</pre>';               


// Get your items
        $sql = 'SELECT sum(schaden) as schaden FROM `monster_activities` WHERE `user_id` = "1" AND `monster_id` = "19"';
        $ergebnis = $db->query( $sql );
                                                                           
        if ($ergebnis->num_rows != 0)
            {
                while ($zeile = $ergebnis->fetch_object())
                    {
                        $zufall_items                = array();
                        $schaden                     = $zeile->schaden;
                        $schaden_epic             = 5000;
                        $schaden_min             = 1000;
                        $epic                             = 0;
                        $x                                = 0;

                       
                        if ($schaden > $schaden_min)
                            {
                                while ($schaden > $schaden_epic)
                                    {
                                        $schaden = $schaden - $schaden_epic;
                                        $epic ++;
                                    }
                                   
                               
                                $items = "4;1";
                                // Zuweisung von Zufall items
                                $monster_items = explode(";", $items);
                                while ($x < $epic)
                                    {
                                        $zufall_items[] = $monster_items[array_rand($monster_items, 1)];
                                        $x++;
                                    }


                               
                                // Ist noch ein weiteres item möglich                                                               
                                $schaden = $schaden - $schaden_min;
                               

                                if ($schaden > 0)
                                    {
                                        $possible_epic = ($schaden / $schaden_epic) * 100;
                                       

                                        if (rand(0,100) <= $possible_epic)
                                            {
                                                $zufall_items[] = $monster_items[array_rand($monster_items, 1)];
                                            }
                                    }
                                   
$itemIds = array_column($_SESSION['inventar'], 'Item_ID');

foreach($zufall_items as $idx => $zufallsItem){
    if(in_array($zufallsItem, $itemIds)){
        $_SESSION['inventar'][$idx]['Anzahl']++;
    }else{
        $_SESSION['inventar'][] = array('Item_ID' => $zufallsItem, 'Anzahl' => 1, 'Level' => 0);
    }
}



                               
                               
                               
                            }
                        else
                            {
                                // kein item
                            }                       

                    }
            }

                   
echo "NEUE SESSION INVENTAR<br />";
echo '<pre>';
print_r($_SESSION['inventar']);
echo '</pre>';
 
Sorry, Ich will diesen Code nicht lesen.
- Mindestens hier im Forum ist er unlesbar formatiert
- Ich habe keine Ahnung was der Code machen soll. Es ist Mühselig anhand eines Codes herauszufinden, was überhaubt das Thema ist.
- Habe ich nicht die Zeit ganze Programme zu Reviewen
- Der Stundenansatz zu dem ich auf Auftrag Arbeite ist 150.- CHF

Ich helfe gerne im kleinen Rahmen. Darum:
Schreib was nicht geht.
Debuge und veröffentliche das Resultat deiner print_r()
Und Frage gezielt
 
kurz gesagt:

das ist mein array mit Zufallswerten:

Array
(
[0] => 1 // ITEM ID
[1] => 8 // ITEM ID
[2] => 4 // ITEM ID
)


und das ist mein bestehens Array

Array
(
[0] => Array
(
[Item_ID] => 1
[Anzahl] => 1
[Level] => 0
)

[1] => Array
(
[Item_ID] => 8
[Anzahl] => 1
[Level] => 0
)

[2] => Array
(
[Item_ID] => 4
[Anzahl] => 1
[Level] => 0
)
)


jetzt soll überpürft werden, ob die ITEM ID von Array 1 im Array 2 vorkommt.
wenn ja => im Array 2 den jeweiligen Anzahl Wert + 1
wenn nein => neuen Eintrag im Array 2
 
Sorry, ich hatte noch einen klitze kleinen Fehler im Script.
$idx muss über array_search ermittelt werden, da ja der index der Items gefragt ist.

Test mit Item_Id 1,3,4 und Zufalls_id 1,4,12
PHP:
$item_array = array(
    array(
        'Item_ID' => 1,
        'Anzahl' => 1,
        'Level' => 0
    ),
    array(
        'Item_ID' => 3,
        'Anzahl' => 1,
        'Level' => 0
    ),
    array(
        'Item_ID' => 4,
        'Anzahl' => 1,
        'Level' => 0
    )
);

$zufall_items = array(1, 4, 12);

//Und hier der eigentlioche Code
//Alle Item_Id extrahieren
$itemIds = array_column($item_array, 'Item_ID');

//über alle Zufallsitems iterieren
foreach($zufall_items as $zufallsItem){
    //Die Den Index aus de Items ermitteln und Prüfen ob der Index !== False ist.
    if(($idx = array_search($zufallsItem, $itemIds)) !== false){
        //Item_Id besteht. Ergo die Anzahl um eins erhöhen
        $item_array[$idx]['Anzahl']++;
    }else{
        //Neuer Eintrag erstellen
        $item_array[] = array('Item_ID' => $zufallsItem, 'Anzahl' => 1, 'Level' => 0);
    }
}

print_r($item_array);

Ausgabe
Code:
Array
(
    [0] => Array
        (
            [Item_ID] => 1
            [Anzahl] => 2
            [Level] => 0
        )

    [1] => Array
        (
            [Item_ID] => 3
            [Anzahl] => 1
            [Level] => 0
        )

    [2] => Array
        (
            [Item_ID] => 4
            [Anzahl] => 2
            [Level] => 0
        )

    [3] => Array
        (
            [Item_ID] => 12
            [Anzahl] => 1
            [Level] => 0
        )

)
 
danke, sieht auf den ersten Blick schon ganz gut aus, allerdings ist mir ein Fehler aufgefallen:
habe dein Script erst mal mit den richtige variabeln angepasst:

PHP:
$itemIds = array_column($_SESSION['inventar'], 'Item_ID');
foreach($zufall_items as $zufallsItem)
    {
        if(($idx = array_search($zufallsItem, $itemIds)) !== false)
            {
                $_SESSION['inventar'][$idx]['Anzahl']++;
            }
        else
            {
            $_SESSION['inventar'][] = array('Item_ID' => $zufallsItem, 'Anzahl' => 1, 'Level' => 0);
        }
    }


Jetzt ist mir folgendes aufgefallen, dass wenn SESSION['inventar'] komplett leer ist am Anfang, folgendes Resultat entsteht:

Zufall Array
(
[0] => 8 // ITEM ID
[1] => 4 // ITEM ID
[2] => 4 // ITEM ID
)

SESSION Array
(
[] => Array
(
[Anzahl] => 3
)

)
 
Schmeiss mal direkt vor dem Codeschnipsel noch den folgenden Code hinein.
Damit wird $_SESSION['inventar'] als leerer Array initialisiert, falls $_SESSION['inventar'] noch nicht gesetzt ist.
PHP:
if(!isset($_SESSION['inventar'])) $_SESSION['inventar'] = array();

Versuch es nochmals
 
sieht auch wieder gut aus, allerdings wieder ein Problem.
Habe die Seite jetzt öfterns neu geladen, und die anzahl wurde immer korrekt + 1 gezählt

So sah das Session Array vor dem Fehler aus:

Array
(
[0] => Array
(
[Item_ID] => 4
[Anzahl] => 4
[Level] => 0
)

[1] => Array
(
[Item_ID] => 8
[Anzahl] => 4
[Level] => 0
)
)

Als beim nächsten neu laden eine neue ITEM ID dazu kam, sah meine Session Array so aus:

ZUFALLS ITEM Array
(
[0] => 1
[1] => 1
)

Array
(
[0] => Array
(
[Item_ID] => 4
[Anzahl] => 4
[Level] => 0
)

[1] => Array
(
[Item_ID] => 8
[Anzahl] => 4
[Level] => 0
)

[2] => Array
(
[Item_ID] => 1
[Anzahl] => 1
[Level] => 0
)

[3] => Array
(
[Item_ID] => 1
[Anzahl] => 1
[Level] => 0
)
)
 
Hi,

Ich will mich hier nicht zwischen euch zwei einmischen, aber:
Geh doch den Code von Yaslaw nochmal durch, Schritt für Schritt. Verstehe was da gemacht wird, baue ggfs zwischendrin mal Debug-Ausgaben ein. Finde den Fehler.

Mir kommt das langsam so vor als ob der Thread hier ausufert und du nur fertigen Code haben willst.
Sobald was nicht geht => hier antworten ohne selbst nachzuschauen was schief laufen könnte.

Grüsse,
BK
 
Zurück