PHP массив объединить - PullRequest
       21

PHP массив объединить

3 голосов
/ 15 октября 2010

У меня есть следующий массив:

Array
(
    [0] => Array
        (
            [id] => 160
            [payment_period] => Monthly
            [plan_payment_type_id] => 171
            [payment_type_id] => 4
        )
    [1] => Array
        (
            [id] => 160
            [payment_period] => Monthly
            [plan_payment_type_id] => 172
            [payment_type_id] => 5
        )
    [2] => Array
        (
            [id] => 161
            [payment_period] => Weekly
            [plan_payment_type_id] => 173
            [payment_type_id] => 9
        )
)

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

Array
(
    [0] => Array
        (
            [id] => 160
            [payment_period] => Monthly
            [payment_types] => Array(
                [0] => Array(
                    [plan_payment_type_id] => 171
                    [payment_type_id] => 4
                )
                [1] => Array(
                    [plan_payment_type_id] => 172
                    [payment_type_id] => 5
                )
            )
        )
    [1] => Array
        (
            [id] => 161
            [payment_period] => Weekly
            [payment_types] => Array(
                [0] => Array(
                    [plan_payment_type_id] => 173
                    [payment_type_id] => 9
                )
            )
        )
)

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Примерно так:

$output = array();
$id_array = array();
$i = 0;
foreach($input as $key=>$val) {
        if(array_key_exists($val['id'],$id_array)) {
                $pos = $id_array[$val['id']];
                $output[$pos]['payment_types'][] = array('plan_payment_type_id'=> $val['plan_payment_type_id'],'payment_type_id' => $val['payment_type_id']);
        } else {
                $output[$i] = array('id' => $val['id'],'payment_period' => $val['payment_period'],'payment_types' => array(array('plan_payment_type_id'=> $val['plan_payment_type_id'],'payment_type_id' => $val['payment_type_id'])));
                echo "Adding ",$val['id'],"\n";
                $id_array[$val['id']] = $i; 
                $i++;
        }   
}

Рабочая ссылка

1 голос
/ 15 октября 2010

Вы застряли, потому что вы пытаетесь создать перечислимый массив, когда вы действительно хотите сгруппировать это по идентификатору массива .Просто используйте поле "id" в качестве целевого индекса:

foreach ($in as $src) {
    extract($src);
    $output[$id]["id"] = $id;
    $output[$id]["payment_period"] = $payment_period;
    $output[$id]["payment_types"][] = array(
        "plan_payment_type_id" => $plan_payment_type_id,
        "payment_type_id" => $payment_type_id,
    );
}

Конечно, вы можете использовать длинные имена переменных $ src [] вместо ярлыка evil extract ().

В любом случае, этоМетод группирует ваш выходной массив по $ id, но также сохраняет внутренний ключ "id" => $ id.

...