在php中合并两个具有略微不同属性的对象

时间:2017-06-25 11:36:49

标签: php arrays oop object merge

我有两个对象数组,它们是从数据库查询中填充的,并且定义如下:

ARRAY1:

foreach ($grade_records as $record) {
    $grade_object = new stdClass();
    $grade_object->fields = array(
        'id'    => $record->id,
        'grade'    => $record->grade,
        'user_id'   => $record->user_id,
        'course_id' => $record->course_id,
    );

    array_push($grades, $grade_object);
}

数组2:

foreach ($attendance_records as $record) {
    $attendance_object = new stdClass();
    $attendance_object->fields = array(
        'id'         => $record->id,
        'attendance' => $record->attendance,
        'user_id'    => $record->user_id,
        'course_id'  => $record->course_id
    );

    array_push($attendance, $attendance_object);
}

我想以最有效的方式将这些数组合并到包含具有每个对象的组合属性的对象的数组中。 我尝试使用以下代码:

foreach ($attendance as $att_record) {
    foreach ($grades as $grd_record) {
        if ($att_record->id == $grd_record->id) {
           $new = (object) array_merge((array) $att_record, (array) $grd_record);
           array_push($final_array, $new);
        }
    }
}

但这给了我一个没有添加"等级"属性。 我也尝试使用array_merge_recursive,但它什么都没改变。

修改 结束使用:

foreach ($att_objs as $att_key => $att_data) {
    foreach ($grd_objs as $grd_key => $grd_data) {
        if ($grd_data->fields['Id'] == $att_data->fields['Id']) {
            $merged_obj = new stdclass();
            $merged_obj->fields = array_merge($att_data->fields, $grd_data->fields);
            unset($att_objs[$att_key]);
            unset($grd_objs[$grd_key]);
            array_push($merged_objs, $merged_obj);
        }
    }
}
$merged_objs = array_merge($merged_objs, $att_objs);
$merged_objs = array_merge($merged_objs, $grd_objs);

2 个答案:

答案 0 :(得分:2)

这个怎么样?

<?php

$grades = [];

foreach ($grade_records as $record) {
    $grade_object = new stdClass();
    $grade_object->fields = array(
        'id'        => $record->id,
        'grade'     => $record->grade,
        'user_id'   => $record->user_id,
        'course_id' => $record->course_id,
    );

    $grades[$record->id] = $grade_object;
}

$attendance = [];

foreach ($attendance_records as $record) {
    $attendance_object = new stdClass();
    $attendance_object->fields = array(
        'id'         => $record->id,
        'attendance' => $record->attendance,
        'user_id'    => $record->user_id,
        'course_id'  => $record->course_id
    );

    $attendance[$record->id] = $attendance_object;
}

$identifiers = array_intersect(
    array_keys($grades),
    array_keys($attendance)
);

$final_array = [];

foreach ($identifiers as $id) {
    $object = new \stdClass();
    $object->fields = \array_merge(
        $grades[$id]->fields,
        $attendance[$id]->fields
    );

    $final_array[] = $object;
}

答案 1 :(得分:1)

public ActionResult Index() { //some stuff return View(); } 中,如果两个或多个数组元素具有相同的键,则最后一个数组元素将覆盖其他元素。在您的情况下,array_merge()$att_record都有相同的密钥$grd_record。因此,如果您替换其中任何一个中的'fields'个键,您将获得所需的结果。