首页 > 解决方案 > 如何在 PHP 中合并选定的数组元素?

问题描述

我有一个数组

$array = array (
0 => array( 'name' => 'zero'), 
1 => array( 'name' => 'one'), 
2 => array( 'name' => 'two'), 
3 => array( 'name' => 'three'), 
4 => array( 'name' => 'four'),
5 => array( 'name' => 'five'),
6 => array( 'name' => 'six'),
);

我需要根据模式合并一些元素

$pattern = array(
array('from'=>1, 'to'=>2, 'note'=>'something'),
array('from'=>3, 'to'=>5, 'note'=>'something'),
array('from'=>6, 'to'=>6, 'note'=>'something'),
);

如何合并元素以获得数组

$ result = array(
['0'] => array('name'=>'zero'),
['1,2'] => array('name'=>'one+two', 'note'=>'something'),
['3,4,5'] => array('name'=>'three+four+five', 'note'=>'something'),
['6'] => array('name'=>'six', 'note'=>'something'),
);

我知道我应该在一个循环中迭代一个数组并检查另一个数组是否有相应的元素来创建一个新数组,但是我应该迭代哪一个呢?

标签: phparrays

解决方案


如果数组键实际上并不重要,那么我会这样做:

$result = $processed = [];

foreach($pattern as $p) { // loop over the patterns
  $temp = [];
  for($i = $p['from']; $i <= $p['to']; ++$i) { // loop over from -> to
    $temp[] = $array[$i]['name']; // collect names of those items
    $processed[] = $i; // store index of item as an already processed one
  }
  $result[] = ['name' => implode('+', $temp), 'note' => $p['note']];
}

$temp = [];
foreach($array as $key => $item) {
  if(!in_array($key, $processed)) { // if index is not in list of already processed items
    $temp[] = $item['name'];
  }
}
array_unshift($result, ['name' => implode('+', $temp)]); // add to front of result

这将为您提供表格的结果

Array
(
    [0] => Array
        (
            [name] => zero
        )

    [1] => Array
        (
            [name] => one+two
            [note] => something
        )

    [2] => Array
        (
            [name] => three+four+five
            [note] => something
        )

    [3] => Array
        (
            [name] => six
            [note] => something
        )

)

推荐阅读