array_walk_recursive in PHP 4

Door Henk , 16 jaar geleden, 2.077x bekeken

Deze functie doet hetzelfde als array_walk_recursive in PHP 5 doet. Omdat ik op een bepaalde server nog geen PHP 5 heb, en omdat ik deze functie wel nodig heb, heb ik hem geschreven.

Misschien kunnen jullie hem ooit gebruiken.

Uitleg van de code
Op lijn 2 zie je hoe ik de functie open. Eerst de naam van de functie, dan 2 argumenten, en 1 optioneel argument.De eerste is de array die je wilt doorlopen. We zetten de reference operator & ervoor. Dit doen we zodat de meegegeven array ook echt aangepast kan worden. Normaal kun je de variabele alleen binnen de functie aanpassen, maar doordat de reference operator is meegegeven worden veranderingen ook doorgevoerd in de rest van je script, en niet alleen binnen je functie.De tweede is een string met de functie die over elk deel ind e array heen gehaald moet worden.De derde maar optionele parameter is een mixed variabele die mee kan worden gegeven als parameter voor de callbackfunctie. Als je hiervoor niks invult worden er ook geen parameters meegegeven met de callbackfuncie.
In de functie zelf beginnen we maar met de array doorlopen. Dit doen we met een foreach loop. Voor elk deel van de array kijken we of dit een array is of niet. Als het geen array is, dan controleren we of $mUserArguments null is. Zoja, dan geven we $mUserArguments niet mee als parameter, en zonee dan geven we deze variabele wel mee.Als het wel een array is, dan moet dat deel van de array ook weer doorlopen worden. Dat deel van de array is dan $aArray [ $sKey ]. We gebruiken dus array_walk_recrsive ( $aArray [ $sKey] , $sCallbackfunctie [ , $mUserArguments ] ); (we gebruiken weer dezelfde controle voor $mUserArguments)

Voorbeeld: http://www.4stip.nl/overig/array_walk_recursive/

Gesponsorde koppelingen

PHP script bestanden

  1. arraywalkrecursive-in-php-4

 

Er zijn 11 reacties op 'Arraywalkrecursive in php 4'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Arend a
Arend a
16 jaar geleden
 
0 +1 -0 -1
Nuttige bijdrage! Misschien handig om de functie en je voorbeeld apart te plaatsen?
Henk
Henk
16 jaar geleden
 
0 +1 -0 -1
Bedankt! Ik heb je tip ook doorgevoerd :)
Storeman storeman
storeman storeman
16 jaar geleden
 
0 +1 -0 -1
Hey, leuk. Ik kwam hem laatst ook tegen, op de functiebeschrijving van php.net van array_walk_recursive. Deze functie heeft iets meer beveiliging ingebouwd. Ik post hem hier maar.

Ik heb tevens een copy van de functie gemaakt die de callback voedt met alle keys van bovenliggende arrays (soms wil je dat weten).

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?
function array_walk_recursive(&$input, $funcname, $userdata = "")
{

    if (!is_callable($funcname)) {
        return false;
    }


    if (!is_array($input)) {
        return false;
    }


    foreach ($input AS $key => $value) {
        if (is_array($input[$key])) {
            array_walk_recursive($input[$key], $funcname, $userdata);
        }
else {
            $saved_value = $value;
            $saved_key = $key;

            if (!empty($userdata)) {
                $funcname($value, $key, $userdata);
            }
else {
                $funcname($value, $key);
            }


            if ($value != $saved_value || $saved_key != $key) {
                unset($input[$saved_key]);
                $input[$key] = $value;
            }
        }
    }

    return true;
}

function
array_walk_recursive_allkeys(&$input, $funcname, $userdata = "", $prevkeys = array()) {
    if (!is_callable($funcname)) {
        return false;
    }


    if (!is_array($input)) {
        return false;
    }


    foreach ($input AS $key => $value) {
        if (is_array($input[$key])) {
            $passArr = $prevkeys;
            $passArr[] = $key;
            array_walk_recursive_allkeys($input[$key], $funcname, $userdata, $passArr);
        }
else {
            $saved_value = $value;
            $saved_key = $key;

            if (!empty($userdata)) {
                $funcname($value, $prevkeys, $userdata);
            }
else {
                $funcname($value, $prevkeys);
            }


            if ($value != $saved_value || $saved_key != $key) {
                unset($input[$saved_key]);
                $input[$key] = $value;
            }
        }
    }

    return true;
}

?>
/code]
Henk
Henk
16 jaar geleden
 
0 +1 -0 -1
Hoi storeman,

Ik heb ook gedacht aan dit soort controles, maar heb ze er toch maar uit gelaten.

Bovendien vind ik jouw manier toch niet helemaal fijn: als de functie nu false returnt, dan weet je niet wat er fout is. Als je PHP gewoon de errors laat zien van "Fatal error: Call to undefined function: ...() in ..." of "Warning: Invalid argument supplied for foreach() in ..." dan zie je meteen wat fout is. Toch is dat misschien toch iets te lomp inderdaad.

En dit stukje code vind ik een beetje raar / nutteloos / snap ik niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    if ($value != $saved_value || $saved_key != $key) {
        unset($input[$saved_key]);
        $input[$key] = $value;
    }

?>
Wat je doet: Als de oude waarde niet gelijk is aan de nieuwe waarde, of als de oude sleutel niet gelijk is aan de nieuwe sleutel, dan pas vervangen we de oude waarde in de $input-array met de nieuwe. -Waarom vervang je hem niet gewoon, zonder die controle? Dat snap ik niet.

De extra parameter $userarguments is overigens wel nuttig :-) Die zal ik erbij zetten.

De voorgaande sleutels meegeven lijkt mij nu niet nuttig, maar kan natuurlijk nuttig zijn in jouw situatie. Dat is een extra en die kan je zelf inbouwen in de functie.

Bedankt voor je toevoeging.

Wat vinden jullie? Zal ik de controles of de functie wel aanroepbaar is en of de input wel een array is erbij zetten? En zoja, wat zal ik doen als de de input niet door de controles komt?

Henk
- -
- -
16 jaar geleden
 
0 +1 -0 -1
Ik ben in principe van mening dat elke provider enigszins moet overstappen naar PHP5 op zich. Daarom zie ik het nu van dit script deze functie redelijk niet in.
Kalle P
Kalle P
16 jaar geleden
 
0 +1 -0 -1
Zoals altijd mijn geheugen laat me nooit in de steek

Mijn grote player vriend (Janus natuurlijk):
http://www.phphulp.nl/php/scripts/1/761/


mazzzzzzzzzel
Henk
Henk
16 jaar geleden
 
0 +1 -0 -1
Kalle schreef op 25.07.2007 01:05:
Zoals altijd mijn geheugen laat me nooit in de steek

Mijn grote player vriend (Janus natuurlijk):
http://www.phphulp.nl/php/scripts/1/761/


mazzzzzzzzzel
http://www.phphulp.nl/php/scripts/1/761/:
PHP versie: 5

http://www.phphulp.nl/php/scripts/1/1084/:
PHP versie: 4
mazzzzzzzzzel
Paul K
Paul K
16 jaar geleden
 
0 +1 -0 -1
Ehm jongens?
PHP 4 gaat dr bijna uit. Moeten we dan nu nog PHP 4 scripts gaan plaatsen :P
Bel mooi gescript :P
Lord Niek
Lord Niek
16 jaar geleden
 
0 +1 -0 -1
leuk script, Boris!
Joeri
Joeri
16 jaar geleden
 
0 +1 -0 -1
Leuk, net op tijd nu dat PHP 4 en toch gaat uitgaan. Wel zeer intressant en leerzaam voor velen.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Henk
Henk
16 jaar geleden
 
0 +1 -0 -1
Nu net nog wat meer toelichting toegevoegd.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. arraywalkrecursive-in-php-4

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.