【问题标题】:chaging value in a certain array if it equal value in another array如果某个数组中的值等于另一个数组中的值,则更改该数组中的值
【发布时间】:2018-07-23 09:55:58
【问题描述】:

我遇到了一个小问题。 我有两个简单的数组,第一个包含主管首选项及其值。第二个数组包含所有首选项及其默认值。

我想创建一个数组,向我显示所有可用的首选项,并将它们的值更改为主管首选项中的值(如果存在),否则保留默认值。


这是我的两个默认数组:
$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 保持不变...

如果您愿意,我还上传了我的代码的colored image

知道我错过了什么吗?

顺便说一句:抱歉我的英语不好,这不是我的母语。

【问题讨论】:

    标签: php arrays php-5.3 dynamic-values


    【解决方案1】:

    在您的代码中,在倒数第二个 foreach 循环运行后,$iPreferenceID 始终设置为最后一个 id ('2'),$iSupervisorPreferenceValue 始终设置为 $aSupervisorXPreferences 中的最后一个值 (1)大批。第一个循环中的 $iSupervisorDefaultPreferenceValue 也是如此。

    因此,在最后一个 foreach 循环中,您始终使用前一个循环中的“最后一个”值,而不是与当前 id 匹配的值。要解决此问题,您的 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>';
    

    【讨论】:

    • 你太棒了,这项工作很棒! :) 我明白我做错了什么。我注意到我只获得了“最后一个”值,但我找不到显示每个循环的“值”的方法,所以你真的帮助了我:) 谢谢你的帮助!
    • 不客气,我很高兴看到你成功了! :)
    • 太棒了!我需要对数组、foreach、while 和创建函数进行更多培训,因为我还有一些困难,但在像你这样的人的帮助下,我肯定会变得越来越好:)
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多