Scripts

Multidim. array bijwerken

(Dit is mijn eerste script die ik hier post, dus opmerkingen zijn welkom.) Ik kwam laatst bij een configuration class een probleem tegen. Ik had mijn instellingen in een multidimensionale array staan, werkte perfect. Maar als ik nou enkele dieper gelegen elementen wilde bijwerken of verwijderen gaf dat problemen. Moeilijk uit te leggen zonder een voorbeeldje (en dan nog): Stel ik heb de volgende (verkorte) configuratie in een array (print_r()'d): (ik heb dus meerdere MySQL profielen) Als ik nu $cfg['mysql'] ['host'] wil veranderen, kan ik dat wel mooi zo doen: $cfg['mysql'] ['host'] = '127.0.0.1'; Maar dat is natuurlijk niet mooi als je bijvoorbeeld classes gebruikt. Hoe geef je de dieper gelegen keys dan door aan een functie (of method, in mijn geval) ? Doorgeven als parameters is geen optie, dat is alleen maar meer werk, en je kan maar één waarde per keer bijwerken. Een 'nieuwe' array als parameter doorgeven is natuurlijk het makkelijkste. Maar hoe kan je die dan 'combineren' met je huidige configuratie array? Hiervoor heb ik alle array_* functies van php zelf bekeken, maar geen goede oplossing gevonden. array_merge() doet wel iets soortgelijks, maar als je bijvoorbeeld $new_cfg['mysql'] meegeeft waar alleen ['host'] in is geset omdat je alleen die wilt veranderen, bevat $cfg['mysql'] alleen nog de key ['host']. Een beetje moeilijk uit te leggen, maar het komt erop neer dat php's array functies níet álleen keys veranderen waarvan je dat wilt. Dit is de functie die ik hiervoor geschreven heb (origineel een method voor mijn class, maar heb hem even veranderd naar een functie):

multidim-array-bijwerken
[code]<?php
function array_update( &$p_aOrigArray, $p_aValues, $p_bDelete = false )
{
    if ( is_array( $p_aOrigArray ) && is_array( $p_aValues ) ) {
    
        foreach ($p_aValues as $k => $v) {

            if ( is_array( $p_aValues[$k] ) && is_array( $p_aOrigArray[$k] ) ) {

                /**
                 *  If the sub element is an array, run the update cycle through each of its elements.
                 *  call_user_func_array is used for its reference compatibility (passing a reference
                 *  with a normal function call  will result in a warning).
                 */                
                call_user_func_array( __FUNCTION__, array( &$p_aOrigArray[$k], $p_aValues[$k], $p_bDelete ) );

            } elseif ( $p_bDelete ) {
            
                /**
                 *  Delete the element if asked for.
                 */
                unset( $p_aOrigArray[$k] );
                
            } else {
            
                /**
                 *  Or just update with the new value.
                 */
                $p_aOrigArray[$k] = $p_aValues[$k];
            }
        }
    }
}
?>[/code]
Gebruik is als volgt:
[code]<?php
array_update( $aOrigineleArray, $aArrayMetNieuweWaarden, $bOfDeKeysVerwijderdMoetenWorden );
print_r( $aOrigineleArray );
?>[/code]
De eerste parameter (met de originele array) wordt dus meegegeven als reference.
Als je de keys wilt verwijderen maakt het niet uit wat de nieuwe waarden zijn in de tweede parameter. Zet dan de derde parameter op true.

Reacties

0
Nog geen reacties.