【问题标题】:How to add (update with) new element into array of objects if another array of objects element id have same id?如果另一个对象数组元素ID具有相同的ID,如何将新元素添加(更新)到对象数组中?
【发布时间】:2014-04-26 02:42:42
【问题描述】:

我在 PHP 中有这些数组:

Array1
(
[0] => stdClass Object
    (
        [expense_id] => 475
        [expense_name] => DRAY 
        [expense_unit_cost] => 270.00
    )

[1] => stdClass Object
    (
        [expense_id] => 476
        [expense_name] => FUEL 
        [expense_unit_cost] => 32.40
    )

)

Array2
(
[0] => stdClass Object
    (
        [waybill_id] => 20005044
        [expense_id] => 475
        [tax_select] => tax1
        [tax_id] => 1
        [tax_name] => GST 5%
        [tax_no] => 
        [tax_value] => 13.5000
    )

[1] => stdClass Object
    (
        [waybill_id] => 20005044
        [expense_id] => 475
        [tax_select] => tax2
        [tax_id] => 2
        [tax_name] => QST 9.975%
        [tax_no] => 
        [tax_value] => 26.9325
    )

[2] => stdClass Object
    (
        [waybill_id] => 20005044
        [expense_id] => 476
        [tax_select] => tax1
        [tax_id] => 1
        [tax_name] => GST 5%
        [tax_no] => 
        [tax_value] => 1.6200
    )

[3] => stdClass Object
    (
        [waybill_id] => 20005044
        [expense_id] => 476
        [tax_select] => tax2
        [tax_id] => 2
        [tax_name] => QST 9.975%
        [tax_no] => 
        [tax_value] => 3.2319
    )

)

我需要使用费用 ID 组合 2 个数组,结果必须如下所示:

Array3
(
[0] => stdClass Object
    (
        [expense_id] => 475
        [expense_name] => DRAY 
        [expense_unit_cost] => 270.00
        [expense_taxes] => Array
            (
                [0] => stdClass Object
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 475
                        [tax_select] => tax1
                        [tax_id] => 1
                        [tax_name] => GST 5%
                        [tax_no] => 
                        [tax_value] => 13.5000
                    )

                [1] => stdClass Object
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 475
                        [tax_select] => tax2
                        [tax_id] => 2
                        [tax_name] => QST 9.975%
                        [tax_no] => 
                        [tax_value] => 26.9325
                    )
            )       

    )

[1] => stdClass Object
    (
        [expense_id] => 476
        [expense_name] => FUEL 
        [expense_unit_cost] => 32.40
        [expense_taxes] => Array
            (
                [0] => stdClass Object
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 476
                        [tax_select] => tax1
                        [tax_id] => 1
                        [tax_name] => GST 5%
                        [tax_no] => 
                        [tax_value] => 1.6200
                    )

                [1] => stdClass Object
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 476
                        [tax_select] => tax2
                        [tax_id] => 2
                        [tax_name] => QST 9.975%
                        [tax_no] => 
                        [tax_value] => 3.2319
                    )
            )           

    )

)

如您所见,我在两个数组上都有 expense_id,它需要成为最终 Array3 的关键

我尝试循环一个数组并检查费用 ID 键匹配,但我无法实现我的最终数组。 此外,我还查看了 array_mergearray_maparray_intersect

感谢您的建议。

【问题讨论】:

  • 我认为循环可以解决这个问题,你能把你的代码贴在这里吗,也许有一个错误。
  • 代码要复杂得多,贴在这里。谢谢。

标签: php arrays array-merge


【解决方案1】:

尝试类似...

foreach($object AS $key=>$element){ if ($element->expense_id == 475){ $element->expense_taxes[0] = $stdClass; } }

【讨论】:

  • 谢谢。我之前尝试过但由于对象数组而没有成功。
【解决方案2】:

这有点复杂,因为实际的对象数组是从 ajax 获取到 PHP 中的,但是,我根据 KennyDope 的建议找到了答案。

如果 Array1 是 $expenses_obj 而 Array2 是 $invoice_taxes_obj

        foreach ($expenses_obj as $key => $expense):
            foreach ($invoice_taxes_obj as $key => $tax):
                if ($expense->expense_id == $invoice_taxes_obj[$key]->expense_id){
                    $expense->taxes[] = (array)$invoice_taxes_obj[$key]; 
                }   
            endforeach;
        endforeach;

而最终的结果就是我所需要的:

Array
(
[0] => stdClass Object
    (
        [expense_id] => 475
        [expense_name] => DRAY 
        [expense_unit_cost] => 270.00
        [taxes] => Array
            (
                [0] => Array
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 475
                        [tax_select] => tax1
                        [tax_id] => 1
                        [tax_name] => GST 5%
                        [tax_no] => 
                        [tax_value] => 13.5000
                    )

                [1] => Array
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 475
                        [tax_select] => tax2
                        [tax_id] => 2
                        [tax_name] => QST 9.975%
                        [tax_no] => 
                        [tax_value] => 26.9325
                    )

            )

    )

[1] => stdClass Object
    (
        [expense_id] => 476
        [expense_name] => FUEL 
        [expense_unit_cost] => 32.40
        [taxes] => Array
            (
                [0] => Array
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 476
                        [tax_select] => tax1
                        [tax_id] => 1
                        [tax_name] => GST 5%
                        [tax_no] => 
                        [tax_value] => 1.6200
                    )

                [1] => Array
                    (
                        [waybill_id] => 20005044
                        [expense_id] => 476
                        [tax_select] => tax2
                        [tax_id] => 2
                        [tax_name] => QST 9.975%
                        [tax_no] => 
                        [tax_value] => 3.2319
                    )

            )

    )

)

欢迎您的 cmets。感谢您的意见。

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多