代码之家  ›  专栏  ›  技术社区  ›  Triwahyu Pamungkas Pribadi

如果数组有相同的键,如何从数组中求值?[副本]

  •  1
  • Triwahyu Pamungkas Pribadi  · 技术社区  · 6 年前

    我得到了这样的多维数组:

    Totalarray
    (
    [0] => Array
        (
            [city] => NewYork
            [cash] => 1000
        )
    
    [1] => Array
        (
            [city] => Philadelphia
            [cash] => 2300
        )
    
    [2] => Array
        (
            [city] => NewYork
            [cash] => 2000
        )
    )
    

    我想对得到相同值[城市]的子数组的值[现金]求和,得到如下数组:

    Totalarray
    (
    [0] => Array
        (
            [city] => NewYork
            [cash] => 3000
        )
    
    [1] => Array
        (
            [city] => Philadelphia
            [cash] => 2300
        )
    )
    

    我该怎么做?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Parag Tyagi    10 年前

    <?php
    
    $arr = array(
            array('city' => 'NewYork', 'cash' => '1000'),
            array('city' => 'Philadelphia', 'cash' => '2300'),
            array('city' => 'NewYork', 'cash' => '2000'),
        );
    
    $newarray = array();
    foreach($arr as $ar)
    {
        foreach($ar as $k => $v)
        {
            if(array_key_exists($v, $newarray))
                $newarray[$v]['cash'] = $newarray[$v]['cash'] + $ar['cash'];
            else if($k == 'city')
                $newarray[$v] = $ar;
        }
    }
    
    print_r($newarray);
    


    Array
    (
        [NewYork] => Array
            (
                [city] => NewYork
                [cash] => 3000
            )
    
        [Philadelphia] => Array
            (
                [city] => Philadelphia
                [cash] => 2300
            )
    
    )
    


    演示:
    http://3v4l.org/D8PME

        2
  •  2
  •   mickmackusa Tom Green    7 年前

    array_reduce() 合并具有相同 city :

    $input = array(
        array('city' => 'NewYork',      'cash' => '1000'),
        array('city' => 'Philadelphia', 'cash' => '2300'),
        array('city' => 'NewYork',      'cash' => '2000'),
    );
    
    $output = array_reduce(
        // Process the input list
        $input,
        // Add each $item from $input to $carry (partial results)
        function (array $carry, array $item) {
            $city = $item['city'];
            // Check if this city already exists in the partial results list
            if (array_key_exists($city, $carry)) {
                // Update the existing item
                $carry[$city]['cash'] += $item['cash'];
            } else {
                // Create a new item, index by city
                $carry[$city] = $item;
            }
            // Always return the updated partial result
            return $carry;
        },
        // Start with an empty list
        array()
    );
    
        3
  •  1
  •   mickmackusa Tom Green    6 年前

    这里有一个方法,它使用临时键来构建结果数组,然后在循环结束后重新索引结果数组。

    代码:( Demo )

    $array=[
        ['city' => 'NewYork', 'cash' => '1000'],
        ['city' => 'Philadelphia', 'cash' => '2300'],
        ['city' => 'NewYork', 'cash' => '2000']
    ];
    
    foreach($array as $a){
        if(!isset($result[$a['city']])){
            $result[$a['city']] = $a;  // store temporary city-keyed result array (avoid Notices)
        }else{
            $result[$a['city']]['cash'] += $a['cash'];  // add current value to previous value
        }
    }
    var_export(array_values($result));  // remove temporary keys
    
        4
  •  -1
  •   Whirlwind    10 年前

     $sumArray = array();
    
        foreach ($arrTotal as $k=>$subArray) {
    
            foreach ($subArray as $id=>$value) {
                $sumArray[$subArray['city']]+=$value;
            }
    
        }
    
        var_dump($sumArray);
    

    输出:

    array(2) {
      ["NewYork"]=>
      int(3000)
      ["Philadelphia"]=>
      int(2300)
    }