Нужно простое решение проблемы с массивом PHP? - PullRequest
3 голосов
/ 24 августа 2010

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

У меня есть один массив:

  $items=array(
    0=> array('name'=>'red','value'=>2),
    1=> array('name'=>'black','value'=>1),
    2=> array('name'=>'red','value'=>3)
  );

И мне нужна функция, которая обнаруживает идентичные имена и объединяет их, складываяих ценности.Это означает, что после завершения функции массив должен выглядеть следующим образом:

  $items=array(
    0=>array('name'=>'red','value'=>5),
    1=>array('name'=>'black','value'=>1)
  );

(в 'red' есть две записи со значениями 2 и 3, после операции red должен иметь 1 запись со значением 5)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Это должно сделать работу:

// create a asssociative array with the name as the key and adding the values
$newitems = array();

foreach($items as $item){
  $newitems[$item['name']] += $item['value']:
}
// unset the original array by reinitializing it as an empty array
$items = array():
// convert the newitems array the the old structure
foreach($newitems as $key => $item){
  $items[] = array('name' => $key, 'value' => $item):
}
2 голосов
/ 24 августа 2010

Что-то вроде этого должно быть примерно таким же хорошим, как оно получается:

$map = array();
foreach ($items as $i => $item)
{
  if (!array_key_exists($item['name'], $map))
    $map[$item['name']] = $i;
  else
  {
    $items[$map[$item['name']]]['value'] += $item['value'];
    unset($items[$i]);
  }
}

Обратите внимание, что это изменяет исходный массив $items.

2 голосов
/ 24 августа 2010

Прежде всего, вы можете просто сделать его ассоциативным массивом, чтобы он обрабатывал себя для вас?

$items = array(
    'red' => 5,
    'black' => 1,
);

Если нет, вы всегда можете сделать это, скопировав массив в цикле (не самый лучший, но он работает каждый раз):

$newItems = array();
foreach ($items as $item) {
    if (!isset($newItems[$item['name']])) {
        $newItems[$item['name']] = $item;
    } else {
        $newItems[$item['name']]['value'] += $item['value'];
    }
}
$items = array_values($newItems);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...