以编码方式替换数组的元素

时间:2017-05-05 17:37:47

标签: php arrays replace associative

我需要创建一系列价格。所以我有一系列基价和一系列促销价格,如果促销价格低于基价,我就把它放在新的价格阵列中。为此,我写了这段代码:

<?php 
    $array_base_prices = array(
        array('id'=>1, 'price'=>10),
        array('id'=>2, 'price'=>2),
        array('id'=>3, 'price'=>30),
        array('id'=>4, 'price'=>40)
     );

     $array_promo = array(
        array('id'=>1, 'price'=>20),
        array('id'=>2, 'price'=>5),
        array('id'=>3, 'price'=>2)
     );

     $base_prices_with_promo = array();

     foreach ( $array_base_prices as $j => $u ) {

        foreach ( $array_promo as $k => $v ) {

           if ( ($v['id'] == $u['id']) && $u['price'] < $v['price']) {

                $base_prices_with_promo[$j]['id'] = $array_base_prices[$j]['id'];
                $base_prices_with_promo[$j]['price'] = $array_base_prices[$j]['price'];

           }

           if ( ($v['id'] == $u['id']) && $u['price'] > $v['price']) {

                $base_prices_with_promo[$j]['id'] = $array_promo[$k]['id'];
                $base_prices_with_promo[$j]['price'] = $array_promo[$k]['price'];            

           }

        }

    }

    $base_prices_with_promo = array_replace( $array_base_prices, $base_prices_with_promo );

    echo "<pre>";
    print_r($base_prices_with_promo);
    echo "</pre>";

?>

并且它工作正常,但我认为嵌套if中的foreach条件有点混乱。我正在使用多维关联数组,非常大,有很多键。因此,我想知道是否有更好的替代方案可以达到相同的效果。

1 个答案:

答案 0 :(得分:0)

我确实没有足够的上下文来确定这是一个适合您的选项,但是从您的小例子我会将数组声明更改为:

$array_base_prices = array(
    1 => 10,
    2 => 2,
    3 => 30,
    4 => 40
);

$array_promo = array(
    1 => 20,
    2 => 5,
    3 => 2
);

如果您需要存储的数据多于价格,请使用数组:

$array_base_prices = array(
    1 => array("price" => 10, "something_else" => null)
);

重点是将id作为父数组的索引。然后你的嵌套循环转向:

foreach ($array_base_prices as $id => $base_price) {
    $base_prices_with_promo[$id] = $base_price;
    if (isset($array_promo[$id]) && $base_price > $array_promo[$id]) {
        $base_prices_with_promo[$id] = $array_promo[$id];
    }
}