PHP Multidimensional array doorzoeken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jin vanTongeren

Jin vanTongeren

29/08/2019 16:36:58
Quote Anchor link
Hallo,
Ik heb een multidimensional array, die meerdere keren dezelfde values heeft.
Maar die values zitten op verschillende plekken in de array.
En aangezien de array ongeveer 310 keys heeft, heb ik een functie geprobeerd die dan zoekt door de multidimensional array en vervolgens de keys van alle values returned / weergeeft.
Functie:
(Ik ben al een tijd niet meer op deze website geweest, dus ik weet niet hoe ik de code goed kan laten weergeven op dit forum, dus sorry als het niet goed is weergegeven)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function searchForKey($id, $array) {
$i = 0;
    foreach ($array as $key => $val) {
$maxi = 7;
       if($i++ < $maxi) {
           continue;
       }

       else if ($val['A'] === $id) {
          
            $keydb[] = $key;
            return $keydb;
        }
    }

    if(in_array($key, $keydb)) {
        $i++;
        $maxi + 10;
    }
    
   return null;
    
}

?>

Deze functie die doet het deels.
Het probleem is alleen dat hij maar 1x zoekt naar de value. Als hij de value heeft gevonden, stopt de uitvoering ervan.
Dat heb ik dus opgelost door de functie een aantal keer uit te laten voeren met het aantal indexes (310)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
for($i = 0; $i < count($array); $i++ {
$keys = searchForKey("Datum:", $array)
var_dump($keys);
}

?>

Dus nu werd de functie uitgevoerd met het aantal keer van het aantal indexes.
Maar ik heb nu nog 1 probleem.
Als hij opnieuw wordt uitgevoerd, gaat hij weer bij het begin beginnen, waardoor je dus alleen de 1e key krijgt, maar dan 310 keer.
Ik weet niet hoe ik dit moet oplossen. Ik heb dit geprobeerd via in_array(), maar dat werkte niet.
Heeft iemand een oplossing?

Met vriendelijke groeten,
 
PHP hulp

PHP hulp

22/02/2020 01:06:44
 
- SanThe -

- SanThe -

29/08/2019 16:51:51
Quote Anchor link
Regel 5 $maxi = 7; Waarom staat dit in de foreach()?
Regel 6 if($i++ < $maxi) Dus je slaat er een stel over.
Regel 11 $keydb[] = $key; $keydb bestaat niet.
Regel 12 return $keydb; Bij een return is het direct einde function. Hier krijg je dus het eerste antwoord en meer niet.
Regel 17 $maxi + 10; Doet niets.
 
Jin vanTongeren

Jin vanTongeren

29/08/2019 16:58:10
Quote Anchor link
- SanThe - op 29/08/2019 16:51:51:
Regel 5 $maxi = 7; Waarom staat dit in de foreach()?

Ik probeerde de loop een aantal rijen over te slaan, dus daarom.
- SanThe - op 29/08/2019 16:51:51:
Regel 6 if($i++ < $maxi) Dus je slaat er een stel over.

Dat is omdat de eerste 7 keys mogen worden overgeslagen.
- SanThe - op 29/08/2019 16:51:51:
Regel 11 $keydb[] = $key; $keydb bestaat niet.

Ik probeer de keys die waren gevonden op te slaan in de array $keydb. Zo kon ik later dus return $keydb; doen. En later probeerde ik dus gebaseerd daarop een in_array functie uit te voeren die dus zou kijken of de key al was gevonden. Maar ik weet niet hoe ik de loop die key dan weer laat overslaan, dus ik probeerde $i++ en $maxi + 10;. Maar dat werkte niet.
 
- SanThe -

- SanThe -

29/08/2019 17:18:03
Quote Anchor link
Niet getest:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function searchForKey($id, $array)
{
    $i = 0;
    $maxi = 7;
    $keydb = array();
    foreach ($array as $key => $val)
    {
    if($i++ < $maxi)    continue;
        if ($val['A'] === $id)    $keydb[] = $key;
    }

    if(empty($keydb))    return null;
    return $keydb;
}

?>
 
Jin vanTongeren

Jin vanTongeren

29/08/2019 17:28:33
Quote Anchor link
Ondanks dat je het niet getest hebt, werkt het!!
Ik heb zelf geprobeerd.
Nu heb ik nog 1 vraag. Zou je me willen uitleggen hoe deze code precies werkt en wat het verschil is met mijn code? (Dan leer ik er ook nog van)
 
- SanThe -

- SanThe -

29/08/2019 17:35:02
Quote Anchor link
De vars buiten de foreach() definiëren.
Dus ook even $keydb bekend maken.

De foreach() is heel simpel:
De eerste ($maxi) aantal overslaan.
De rest indien de if() true geeft in $keydb zetten.

Na de loop kijken of er iets in $keydb zit.
Zo ja, $keydb retour geven anders null.
 
Jin vanTongeren

Jin vanTongeren

29/08/2019 17:37:35
Quote Anchor link
Ahh... Ik zie het.
Bedankt voor je hulp!

Toevoeging op 29/08/2019 17:42:32:

Nog even een vraag:
Hoe selecteer ik meerdere indexes van deze output / array?
Dus bijvoorbeeld: ik moet index 1 - 10 selecteren.
Hoe doe ik dat?

Toevoeging op 29/08/2019 17:46:59:

Jin vanTongeren op 29/08/2019 17:37:35:
Ahh... Ik zie het.
Bedankt voor je hulp!

Toevoeging op 29/08/2019 17:42:32:

Nog even een vraag:
Hoe selecteer ik meerdere indexes van deze output / array?
Dus bijvoorbeeld: ik moet index 1 - 10 selecteren.
Hoe doe ik dat?

Laat maar... Ik heb het al. (array_slice())
 
Thomas van den Heuvel

Thomas van den Heuvel

29/08/2019 18:10:46
Quote Anchor link
Ik zou dit soort "magische constanten" zoals "7" en "A" vermijden. Het is niet direct aan de zoekfunctie om te bepalen welke resultaten precies interessant zijn, het is aan de zoekfunctie om simpelweg (met de nadruk op "simpel") te zoeken. Wat nu als straks de eerste 12 resultaten niet relevant zijn? Of dat je alles van index "B" wilt weten? Dan zou je de implementatie van de functie moeten veranderen. Ik zou gewoon alle waarden van een index retourneren, en dan bepaal je maar in de functionaliteit die deze functie aanroept welke resultaten je hiervan wilt gebruiken, daar zou je dan ook die array_slice() op los kunnen laten met een andere startpunt.

Het lijkt mij vooral zaak dat je de functionaliteit zo simpel mogelijk houdt, anders wordt het een hels karwei om over een tijd te achterhalen wat deze ook alweer deed of betekende. Ik zou je daarom ook zeker aanraden om code te annoteren, als leidraad voor de werking.

Ook uit oogpunt van herbruikbaarheid wil je iets generieks. Als je hier dan dingen als specifieke -hard coded- keys of startindexen in stopt dan holt het potentieel voor hergebruik snel achteruit.

Een vereenvoudigde variant, die op een specifieke (maar instelbare) key en waarde zoekt, en die alles retourneert, altijd als een array, want verschillende return-typen zou je anders ook verschillend moeten afhandelen wat de boel ook weer onnodig compliceert, wordt dan zoiets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
function searchForKey($haystack, $index, $needle) {
    $out = array();
    foreach ($haystack as $key => $value) {
        if ($value[$index] === $needle) {
            $out[] = $key;
        }
    }

    return $out;
}

?>

Hierbij helpt het ook om variabelen zinvolle, zelfdocumenterende namen te geven.
Gewijzigd op 31/08/2019 14:47:28 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.