如何将 php 对象数组从一种形式转换为另一种形式


How to convert php object array from one form to another

有没有一种简单的方法可以从中转换对象数组

stdClass Object
(
    [Title] => Array
        (
            [0] => Title 1
            [1] => Title 2
            [2] => Title 3
            [3] => Title 4
        )
    [description] => Array
        (
            [0] => Description 1
            [1] => Description 2
            [2] => Description 3
            [3] => Description 4
        )
    [myimage] => Array
        (
            [0] => images/events/568a7048f22f9/sizes/athens-img_XS.jpg
            [1] => images/collections/56b2294894c08/islamiki.png
            [2] => images/multimedia/item6.jpg
            [3] => 
        )
)

对此:

stdClass Object
(
    [0] => Array
        (
            [Title] => Title 1
            [description] => Description 1
            [myimage] => images/events/568a7048f22f9/sizes/athens-img_XS.jpg
        )
    [1] => Array
        (
            [Title] => Title 2
            [description] => Description 2
            [myimage] => images/collections/56b2294894c08/islamiki.png
        )
    [2] => Array
        (
            [Title] => Title 3
            [description] => Description 3
            [myimage] => images/multimedia/item6.jpg
        )
    [3] => Array
        (
            [Title] => Title 4
            [description] => Description 4
            [myimage] => 
        )
)

这很有趣...

将"二维矩阵"(列转置为行(。(意识到它做到了这一点 - 在我写它几个月后(

  • 每个输出条目由一个关联的数组组成:

  • 关键是属性名称

  • 数据是该媒体资源的"当前列数据"

eval.in 的演示

使用该函数的演示:

1( 原始数据 - 调用函数....Eval.in

现在,只要数据是一致的,关于属性数和每个属性的数据行数:

您可以更改数据,而无需更改代码。

每个条目有两个额外的属性,三个额外的条目...Eval.in

代码:

// ---------------------------------------------------------------------------
// output in here...
$outArray = array();                         // (step 0)
$propsAsArray = get_object_vars($srcObject);  // (step 1) properties as an array
$rowKeys = array_keys($propsAsArray);         // (step 2) we need the the key names
for ($i = 0, $itemCount = count(current($propsAsArray)); $i < $itemCount; $i++) { // (step 3)
    $column = array_column($propsAsArray, $i); // (step 4) get one vertical column through al the arrays
    $entry = array_combine($rowKeys, $column); // (step 5)
    $outArray[] = $entry;                      // (step 6) 
}
$outArray = (object) $outArray;               // (step 7)

作为一个函数:

function convertArray($srcObject) {
    $propsAsArray = get_object_vars($srcObject);  
    $rowKeys = array_keys($propsAsArray);         
    for ($i = 0, $itemCount = count(current($propsAsArray)); $i < $itemCount; $i++) { 
        $outArray[] = array_combine($rowKeys, 
                                    array_column($propsAsArray, $i)); 
    }
    return (object) $outArray;              
}

输出:

stdClass Object
(
    [0] => Array
        (
            [Title] => Title 1
            [description] => Description 1
            [myimage] => images/events/568a7048f22f9/sizes/athens-img_XS.jpg
        )
    [1] => Array
        (
            [Title] => Title 2
            [description] => Description 2
            [myimage] => images/collections/56b2294894c08/islamiki.png
        )
    [2] => Array
        (
            [Title] => Title 3
            [description] => Description 3
            [myimage] => images/multimedia/item6.jpg
        )
    [3] => Array
        (
            [Title] => Title 4
            [description] => Description 4
            [myimage] => 
        )
)

步骤说明。

我只会评论更involved ones.

第 1 步:

我们需要属性名称和数据数组作为associated array,属性名称作为"键"和相关数据。

这只是一个二维数组,其中"键"是原始属性名称数据是与该属性关联的值的数组。

第 2 步:

获取"每个输出条目的属性名称"。这些是 step 1 中的数组键。

您可以随心所欲地拥有尽可能多的数量。

步骤3:

这是工作开始的地方...

我们将通过"2D 数组"进行vertical slices。这就是array_column所做的。

我们需要知道实际有多少columns数据。但是,这是一个associated array,我们不知道键名。

不是问题:

"当前函数"返回2D array的当前条目的值然后只需计算并存储它。

我这样做是为了提高效率initialization part of 'for' loop

第 4 步:

我们需要通过2D array获得current column ($i)vertical slice.

第 5 步:

我们现在有:

  • 条目的键列表 ($rowKeys(
  • 一个数据数组,其中每个条目都与相应的"属性"匹配

因此,输入并将其添加到输出中。

第 7 步:

将数组转换回stdClass对象。