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

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

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


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

$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 остается неизменным …

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

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

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

0

Решение

В вашем коде после запуска цикла 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>';
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]