PHP-如何在数组中有条件地合并数组的一些键

PHP-如何在数组中有条件地合并数组的一些键,php,arrays,loops,Php,Arrays,Loops,我有一个数组的数组。我需要修改它,只有当数组的company和type与其任何兄弟数组相同时,它们的cars数组才会合并。考虑下面的数组: array( array( 'company' => 'Jeep', 'type' => 'SUV', 'cars' => array( 'Compass', ), ), array( 'compan

我有一个数组的数组。我需要修改它,只有当数组的
company
type
与其任何兄弟数组相同时,它们的
cars
数组才会合并。考虑下面的数组:

array(
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Compass',
        ), 
    ),
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Wrangler',
        ), 
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'Sedan',
        'cars'     => array(
            'C-Class',
        ),
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'SUV',
        'cars'     => array(
            'G Wagon',
        ),
    ),
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Cherokee',
        ), 
    ),
)
处理上述阵列后的预期输出应为:

array(
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Compass',
            'Wrangler',
            'Cherokee',
        ), 
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'Sedan',
        'car'     => array(
            'C-Class',
        ),
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'SUV',
        'car'     => array(
            'G Wagon',
        ),
    ),
)
我试过每个循环,但我想不出来。我认为可以用递归来完成,但我不知道从哪里开始

    foreach ( $array as $one ) {
        foreach ( $array as $two ) {
            $zzz = [];
            if ( $one['company'] === $two['company'] && $one['type'] === $two['type'] ) {
                if ( $one['cars'] === $two['cars'] ) {
                    $zzz = $one;
                } else {
                    $zzz = [
                        'company'    => $one['company'],
                        'type' => $one['type'],
                        'cars'     => array_merge( $one['cars'], $two['cars'] ),
                    ];
                }
            } else {
                $zzz = $one;
            }
            $temp[] = $zzz;
        }
    }

您需要通过循环遍历数组,并检查是否已设置公司和类型

$arr  =array(
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Compass',
        ), 
    ),
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Wrangler',
        ), 
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'Sedan',
        'cars'     => array(
            'C-Class',
        ),
    ),
    array(
        'company' => 'Mercedes',
        'type'    => 'SUV',
        'cars'     => array(
            'G Wagon',
        ),
    ),
    array(
        'company' => 'Jeep',
        'type'    => 'SUV',
        'cars'    => array(
            'Cherokee',
        ), 
    ),
);
$new_array = array();
foreach ($arr as  $value) {
  if(isset($new_array[$value['company']."_".$value['type']]))
    $new_array[$value['company']."_".$value['type']]['cars'][]=$value['cars'][0];
  else
    $new_array[$value['company']."_".$value['type']]=$value;  
}
$new_array = array_values($new_array);
var_dump($new_array);

这是其中一件简单的事情,看起来很难让你理解:

$input = array( /* ... your original array ... */ );
$output = array();

foreach ($input as $icar)
{
    $filed = false;
    foreach ($output as $okey => $ocar) // look for existing brand and type to file into
        if ($ocar['company'] == $icar['company'] && $ocar['type'] == $icar['type'])
        {
            $output[$okey]['cars'][] = $icar['cars'][0];
            $filed = true;
            break; // no need to continue once we put it somewhere
        }

    if (!$filed) // it's a new brand and type so we copy the entire thing
        $output[] = $icar;
}

print_r($output);

带有if条件的简单循环。祝你好运。你的逻辑是什么?@AlivetoDie我已经添加了我的代码。它不起作用。这是我以前没有添加过的。我不是一个被否决的选民,但没有代码工作的问题需要关闭,而不是关闭answer@AlivetoDie很抱歉,我在发布问题时没有添加代码。我后来编辑并添加了它。@Cobra\u Fast谢谢您的帮助:)