使用std类对象重新排列多维数组

时间:2012-02-10 11:35:06

标签: php arrays multidimensional-array

我正在使用std对象之前给出的多维数组

    Array
(
    [0] => abc_Object Object
        (
            [_api:protected] => zvbj
            [_values:protected] => Array
                (
                    [count] => 2
                    [data] => Array
                        (
                            [0] => abc_Charge Object
                                (
                                    [_api:protected] => zvbj
                                    [_values:protected] => Array
                                        (
                                            [id] => dGoEw 
                                            [ine] => fKYF0a
                                            [xyz] => abc_Object Object
                                                (
                                                    [_api:protected] => zvbj
                                                    [_values:protected] => Array
                                                        (
                                                            [id] => uUmuym
                                                            [last] => 4242
                                                        )
                                                )
                                        )
                                )
                            [1] => abc_Charge Object
                                (
                                    [_api:protected] => zvbj
                                    [_values:protected] => Array
                                        (
                                            [id] => dblvEw 
                                            [ine] => fKyyu0a
                                            [xyz] => abc_Object Object
                                                (
                                                    [_api:protected] => z7jj
                                                    [_values:protected] => Array
                                                        (
                                                            [id] => urtuym
                                                            [last] => 4242
                                                        )
                                                )
                                        )
                                )
                        )
                )
        )
    [1] => abc_Object Object
        (
            [_api:protected] => zvbj
            [_values:protected] => Array
                (
                    [count] => 2
                    [data] => Array
                        (
                            [0] => abc_Charge Object
                                (
                                    [_api:protected] => zvbj
                                    [_values:protected] => Array
                                        (
                                            [id] => dGoEw 
                                            [ine] => fKYF0a
                                            [xyz] => abc_Object Object
                                                (
                                                    [_api:protected] => zvbj
                                                    [_values:protected] => Array
                                                        (
                                                            [id] => uUmuym
                                                            [last] => 4242
                                                        )
                                                )
                                        )
                                )
                            [1] => abc_Charge Object
                                (
                                    [_api:protected] => zvbj
                                    [_values:protected] => Array
                                        (
                                            [id] => dblvEw 
                                            [ine] => fKyyu0a
                                            [xyz] => abc_Object Object
                                                (
                                                    [_api:protected] => z7jj
                                                    [_values:protected] => Array
                                                        (
                                                            [id] => urtuym
                                                            [last] => 4242
                                                        )
                                                )
                                        )
                                )
                        )
                )
        )                       
)

我正在尝试将所有这些组合成一个更简单的数组

Array(
[0]=>(
        [id] => dGoEw 
        [ine] => fKYF0a
        [cid] => uUmuym
    )
[1]=>(
        [id] => dblvEw 
        [ine] => fKyyu0a
        [cid] => urtuym
    )
[2]=>(
        [id] => dGoEw 
        [ine] => fKYF0a
        [cid] => uUmuym
    )
[3]=>(
        [id] => dblvEw 
        [ine] => fKyyu0a
        [cid] => urtuym
    )
)

我已经尝试了很多foreach循环和东西,但我甚至无法打印数组的第一个值。我不知道我错过了什么。

echo $arr['_api:protected'];

修改

foreach($arr as $key=>$val)
        {
            echo $val['_api:protected'];
            print_r($val['_values:protected']);
        }

这甚至没有输出

foreach($arr as $key=>$val)
        {
            $aaa = $val['_values:protected']['data'];
            $arr111['id'] = $aaa['_values:protected']['invoice'];
            $arr111['ine'] = $aaa['_values:protected']['id'];
            $arr111['cid'] = $aaa['_values:protected']['xyz']['_values:protected']['id'];
            $arr222[] = $arr111;
        }
        print_r($arr222);

也没有给我任何输出。谁能告诉我我错过了什么?

1 个答案:

答案 0 :(得分:3)

由于您尝试访问的属性定义为protected,因此除非您位于对象类的上下文中,否则无法访问它们,或者扩展对象类的类。您在密钥末尾看到的:protected不是名称的一部分,它告诉您该属性被定义为protected。因此,密钥的名称不是_values:protected,而是_values,其可见性设置为protected

这是一个有点可怕的解决方案,它有两个类,可以让你从有效的上下文中获取数据:

<?php

  class simplifier_Object extends abc_Object {

    public static function getIdFromObj ($obj) {
      return $obj->_values['id'];
    }
    public static function getDataFromObj ($obj) {
      return $obj->_values['data'];
    }

  }

  class simplifier_Charge extends abc_Charge {

    public static function getIdFromObj ($obj) {
      return $obj->_values['id'];
    }
    public static function getIneFromObj ($obj) {
      return $obj->_values['ine'];
    }
    public static function getXyzFromObj ($obj) {
      return $obj->_values['xyz'];
    }

  }

  // Assuming that your input array is held in $arr

  $result = array();
  foreach ($arr as $item) {
    foreach (simplifier_Object::getDataFromObj($item) as $sub) {
      $xyz = simplifier_Charge::getXyzFromObj($sub);
      $result[] = array (
        'id' => simplifier_Charge::getIdFromObj($sub),
        'ine' => simplifier_Charge::getIneFromObj($sub),
        'cid' => simplifier_Object::getIdFromObj($xyz)
      );
    }
  }

  var_dump($result);

如果abc_Object扩展abc_Charge或反之亦然,那么可以将它包装在扩展子对象的单个类中,但它仍然不是一个漂亮的解决方案 - 有人用比我更好的OO头可能有更好的主意。

作为旁注,在开发过程中,您应该在脚本的顶部放置error_reporting(E_ALL); ini_set('display_errors', 1);。如果你有,你会看到上面的代码示例中的许多错误消息,以便为您提供问题所在的线索。

相关问题