Изменение значения в определенном массиве, если оно равно значению в другом массиве

Я столкнулся с небольшой проблемой. У меня есть два простых массива, первый из которых содержит настройки супервизора и их значение. Второй массив содержит все предпочтения и их значения по умолчанию.

Я хочу создать массив, который показывает мне все доступные настройки и изменить их значение на значение из предпочтения супервизора, если оно существует, в противном случае оставить значение по умолчанию.


Вот мои два массива по умолчанию:

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

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

Вот как я хочу, чтобы новый массив выглядел так:

$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
        )

)

И это мой настоящий код (не самый чистый, я знаю ^^):

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>';

Но сейчас мой новый массив выглядит так:

$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
        )

)

Как вы можете видеть, default_preference_value остается неизменным...

Я также загрузил цветное изображение моего кода, если вы предпочитаете.

Есть идеи о том, что мне не хватает?

Кстати: извините за мой плохой английский, это не мой родной язык.

1 ответ

Решение

В вашем коде после запуска цикла foreach "от второго к последнему" для $iPreferenceID всегда устанавливается последний идентификатор ('2'), а для $iSupervisorPreferenceValue всегда устанавливается последнее значение (1) в массиве $aSupervisorXPreferences. То же самое касается $iSupervisorDefaultPreferenceValue в первом цикле.

Поэтому в последнем цикле foreach вы всегда используете "последние" значения из предыдущих циклов вместо значений, которые соответствуют вашему текущему идентификатору. Чтобы это исправить, ваши циклы foreach должны быть вложенными.

Тем не менее, я бы пошел на что-то вроде этого:

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>';
Другие вопросы по тегам