Суммарное значение массива объектов по одному и тому же идентификатору в PHP [duplicate]

Почему бы не использовать новый сканер для каждого чтения? Как показано ниже. При таком подходе вы не столкнетесь с вашей проблемой.

int i = new Scanner(System.in).nextInt();
1
задан ichadhr 13 September 2015 в 06:46
поделиться

5 ответов

Попробуйте

$vendel = array();
$indexArray = array();
foreach ($vd_arr as $miniarray) {
  $vendel[$miniarray['id']]['id'] = $miniarray['id'];

  if(isset($vendel[$miniarray['id']]['qty']))
  {
      $vendel[$miniarray['id']]['qty'] += $miniarray['qty'];
  }
  else 
  {
      $vendel[$miniarray['id']]['qty'] = $miniarray['qty'];
  } 

  $vendel[$miniarray['id']]['delivnote_id'] = $miniarray['delivnote_id'];
}

foreach($vendel as $value) {
  $indexArray[] = $value;
}

return $indexArray;
2
ответ дан Ankur Tiwari 26 August 2018 в 04:14
поделиться

Адаптированный код для включения проверки свойств массива существует до их обращения:

    $vendel = array();
    $indexArray = array();
    foreach ($vd_arr as $miniarray) {

        // Skips adding this mini array if an ID is note present
        if(($id = isset($miniarray['id']) ? $miniarray['id'] : null) === null) {
            continue;
        }

        // The default values at the end of these lines can be swapped out for more suitable defaults
        $qty = isset($miniarray['qty']) ? $miniarray['qty'] : 0;
        $delivnote_id = isset($miniarray['delivnote_id']) ? $miniarray['delivnote_id'] : null;

        $vendel[$id]['id'] = $id;
        $vendel[$id]['qty'] += $qty;
        $vendel[$id]['delivnote_id'] = $delivnote_id;
    }

    foreach($vendel as $value) {
        $indexArray[] = $value;
    }

    return $indexArray;

Это также пропускает добавление элемента $ miniarray, который не имеет идентификатора.

0
ответ дан Ben Plummer 26 August 2018 в 04:14
поделиться

этот другой подход с использованием функционального программирования

    <?php


$data =  json_decode('[
    {
        "id": 1,
        "value1": 5,
        "value2": 10
    },
    {
        "id": 2,
        "value1": 50,
        "value2": 100
    },
    {
        "id": 1,
        "value1": 1,
        "value2": 2
    },
    {
        "id": 2,
        "value1": 15,
        "value2": 20
    },
    {
        "id": 3,
        "value1": 15,
        "value2": 20
    }
]');

//print_r(array_group_by($data,'id'));
print_r(array_sum_by($data,'id',['value1','value2']));
//print_r(array_sum(array_column($data,'value1')));

function array_sum_by($array,$group,$keys)
{
     $groupeddata = array_group_by($array,$group);
    return  array_map(function($items) use($group,$keys) { 

        foreach($keys as $key)
        {
            $values[$key] = array_sum(array_column($items,$key));
        }
        $first = array_shift($items);
        if(is_object( $first ) && isset( $first->{ $group } )){
            $values = array_merge([ $group => $first->{ $group } ], $values);
        }elseif(isset($first[$group])){
            $values = array_merge([ $group => $first[$group] ], $values);
        }
        return $values;
    },$groupeddata); 
}

function array_group_by( array $array, $key )
    {
        if ( ! is_string( $key ) && ! is_int( $key ) && ! is_float( $key ) && ! is_callable( $key ) ) {
            trigger_error( 'array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR );
            return null;
        }
        $func = ( is_callable( $key ) ? $key : null );
        $_key = $key;
        // Load the new array, splitting by the target key
        $grouped = [];
        foreach ( $array as $value ) {
            if ( is_callable( $func ) ) {
                $key = call_user_func( $func, $value );
            } elseif ( is_object( $value ) && isset( $value->{ $_key } ) ) {
                $key = $value->{ $_key };
            } elseif ( isset( $value[ $_key ] ) ) {
                $key = $value[ $_key ];
            } else {
                continue;
            }
            $grouped[ $key ][] = $value;
        }
        // Recursively build a nested grouping if more parameters are supplied
        // Each grouped array value is grouped according to the next sequential key
        if ( func_num_args() > 2 ) {
            $args = func_get_args();
            foreach ( $grouped as $key => $value ) {
                $params = array_merge( [ $value ], array_slice( $args, 2, func_num_args() ) );
                $grouped[ $key ] = call_user_func_array( 'array_group_by', $params );
            }
        }
        return $grouped;
    }
0
ответ дан Fermin Perdomo 26 August 2018 в 04:14
поделиться

Как уже упоминалось, просто проверьте, есть ли qty isset перед добавлением к нему:

$vendel = array();
$indexArray = array();
foreach ($vd_arr as $miniarray) {

  $vendel[$miniarray['id']]['id'] = $miniarray['id'];
  $vendel[$miniarray['id']]['delivnote_id'] = $miniarray['delivnote_id'];
  // the magic is in the next line
  if(!isset($vendel[$miniarray['id']]['qty']))
      $vendel[$miniarray['id']]['qty'] = 0;
  $vendel[$miniarray['id']]['qty'] += $miniarray['qty'];
}

foreach($vendel as $value) {
  $indexArray[] = $value;
}
return $indexArray;

с некоторым рефакторингом мы могли бы избавиться от второго цикла цикла, если мы используем «id» в качестве ключа $ indexArray

$vendel = array();
$indexArray = array();

foreach ($vd_arr as $miniarray) {
    if(!isset($indexArray[$miniarray['id']])) {
        $indexArray[$miniarray['id']] = array(
            'delivnote_id' => $miniarray['delivnote_id']
            ,'qty' => 0
        );
    }
    $indexArray[$miniarray['id']]['qty'] += $miniarray['qty'];
}

return $indexArray;

Или, если вам нужны эти индексы для численного

$vendel = array();
$indexArray = array();
foreach ($vd_arr as $miniarray) {
    if(!isset($indexArray[$miniarray['id']])) {
        $indexArray[$miniarray['id']] = array(
            'id' => $miniarray['id']
            ,'delivnote_id' => $miniarray['delivnote_id']
            ,'qty' => 0
        );
    }
    $indexArray[$miniarray['id']]['qty'] += $miniarray['qty'];
}
return array_values($indexArray);
0
ответ дан Terminus 26 August 2018 в 04:14
поделиться
  • В соответствии с предоставленным кодом проблема возникает на $ vendel [$ miniarray ['id']] ['qty'] + = $ miniarray ['qty'];
  • Это проблема возникает, поскольку вы не определили значение $ vendel [$ miniarray ['id']] ['qty'].
  • Чтобы преодолеть эту проблему, вам необходимо определить начальное значение в $ vendel [$ miniarray ['id']] ['qty'].
  • Вам нужно определить начальное значение qty как ноль, как указано ниже, перед инструкцией foreach, которую вы написали.
  • foreach ($ vd_arr как $ miniarray) {$ vendel [$ miniarray ['id']] ['qty'] = 0;}
0
ответ дан Vishal 26 August 2018 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: