Search code examples
phparraysphp-5.3dynamic-values

chaging value in a certain array if it equal value in another array


I'm facing a little problem. I've two simple arrays, the first contain supervisor preferences and their value. The second array contain all prefences and their default value.

I want to create an array that show me all preferences availalbe and change the value of them for the value from the supervisor preference if it exist, otherwise keep default value.


Here are my two default arrays:

$aSupervisorDefaultPreferences = Array(
    '1' => 1,
    '2' => 1,
    '3' => 1
)

$aSupervisorXPreferences = Array(
    '1' => 0,
    '2' => 1
)

This is how i want the new array to look like:

$aSupervisorDefaultPreferencesDetails: 
Array
(
    [0] => Array
        (
            [preference_id] => 1
            [preference_title] => Administration panel open by default.
            [default_preference_value] => 0
        )

    [1] => Array
        (
            [preference_id] => 2
            [preference_title] => Administration panel grey by default.
            [default_preference_value] => 1
        )

    [2] => Array
        (
            [preference_id] => 3
            [preference_title] => Open "target_blank" in new tab.
            [default_preference_value] => 1
        )

)

And this is my actual code (not the cleanest i know ^^):

foreach ($aSupervisorDefaultPreferences as $iSupervisorDefaultPreferenceID => $iSupervisorDefaultPreferenceValue) {
    $oPreference = new UserSupervisorPreferences($iSupervisorDefaultPreferenceID);
    $sSupervisorDefaultPreferenceTitle = $oPreference->getTitle();

    $aSupervisorDefaultPreferenceDetails = array(
        'preference_id' => $iSupervisorDefaultPreferenceID,
        'preference_title' => $sSupervisorDefaultPreferenceTitle,
        'default_preference_value' => ""
    );
    $aSupervisorDefaultPreferencesDetails[] = $aSupervisorDefaultPreferenceDetails;
}

foreach ($aSupervisorXPreferences as $iSupervisorPreferenceID => $iSupervisorPreferenceValue) {
    $iPreferenceID = $iSupervisorPreferenceID;
}

foreach ($aSupervisorDefaultPreferencesDetails as $iKey => $aSupervisorDefaultPreference) {
    $iDefaultPreferenceID = $aSupervisorDefaultPreferencesDetails[$iKey]['preference_id'];
    if ($iDefaultPreferenceID == $iPreferenceID) {
        $aSupervisorDefaultPreferencesDetails[$iKey]['default_preference_value'] = $iSupervisorPreferenceValue;
    }
    else {
        $aSupervisorDefaultPreferencesDetails[$iKey]['default_preference_value'] = $iSupervisorDefaultPreferenceValue;
    }
}

echo '$aSupervisorDefaultPreferencesDetails: <br />';
echo '<pre>';
print_r($aSupervisorDefaultPreferencesDetails);
echo '</pre>';
echo '<hr>';

But for now my new array look like that:

$aSupervisorDefaultPreferencesDetails: 
Array
(
    [0] => Array
        (
            [preference_id] => 1
            [preference_title] => Administration panel open by default.
            [default_preference_value] => 1
        )

    [1] => Array
        (
            [preference_id] => 2
            [preference_title] => Administration panel grey by default.
            [default_preference_value] => 1
        )

    [2] => Array
        (
            [preference_id] => 3
            [preference_title] => Open "target_blank" in new tab.
            [default_preference_value] => 1
        )

)

As you can see, the default_preference_value keep unchanged...

i've also uploaded a colored image of my code if you prefer.

Any idea on what am i missing ?

BTW: sorry for my bad english, it isn't my native language.


Solution

  • In your code, after the second-to-last foreach loop has run, $iPreferenceID is always set to the last id ('2') and $iSupervisorPreferenceValue is always set to the last value (1) in the $aSupervisorXPreferences array. The same goes for $iSupervisorDefaultPreferenceValue in the first loop.

    Therefore in the last foreach loop, you're always using the "last" values from the previous loops instead of the values that match your current id. To fix this your foreach loops would need to be nested.

    However, I would go for something like this instead:

    foreach ($aSupervisorDefaultPreferences as $iSupervisorDefaultPreferenceID => $iSupervisorDefaultPreferenceValue) {
        $oPreference = new UserSupervisorPreferences($iSupervisorDefaultPreferenceID);
        $sSupervisorDefaultPreferenceTitle = $oPreference->getTitle();
        // If a custom value is set for the current id in the $aSupervisorXPreferences array use that, otherwise use the default value from the $aSupervisorDefaultPreferences array 
        $value = isset($aSupervisorXPreferences[$iSupervisorDefaultPreferenceID]) ? $aSupervisorXPreferences[$iSupervisorDefaultPreferenceID] : $aSupervisorDefaultPreferences[$iSupervisorDefaultPreferenceID]; 
    
        $aSupervisorDefaultPreferenceDetails = array(
            'preference_id' => $iSupervisorDefaultPreferenceID,
            'preference_title' => $sSupervisorDefaultPreferenceTitle,
            'default_preference_value' => $value
        );
        $aSupervisorDefaultPreferencesDetails[] = $aSupervisorDefaultPreferenceDetails;
    }
    
    echo '$aSupervisorDefaultPreferencesDetails: <br />';
    echo '<pre>';
    print_r($aSupervisorDefaultPreferencesDetails);
    echo '</pre>';
    echo '<hr>';