【问题标题】:How do I set up a PHP Class to read from a multidimensional array?如何设置 PHP 类以从多维数组中读取?
【发布时间】:2015-06-21 00:22:04
【问题描述】:

我需要一些外部帮助才能弄清楚我是否会理解如何做到这一点......

我有一个多维数组,我正在尝试为其设置一个类,以便我可以将它用作一个对象,以便我可以动态调用它的一部分。

这是我的数组的一个小 sn-p,因此您可以看到我正在使用的结构。

<?php $modelMap=array(
    'RM3H3FEW' => array('year' => 2015,
                        'model' => 'CR-V',
                        'trim_level'=>array('LX','lx2wd'), 
                        'transmission' => '2WD Continuously Variable ',
                        'colors' => array( 
                                        'BK' => 'Crystal Black Pearl',
                                        'BL' => 'Obsidian Blue Pearl',
                                        'CS' => 'Copper Sunset Pearl',
                                        'KC' => 'Kona Coffee Metallic',
                                        'MA' => 'Mountain Air Metallic',
                                        'MS' => 'Modern Steel Metallic',
                                        'RE' => 'Basque Red Pearl II',
                                        'SI' => 'Alabaster Silver Metallic',
                                        'UT' => 'Urban Titanium Metallic',
                                        'WH' => 'White Diamond Pearl',
                                        )
                        ),
    'RM4H3FEW' => array('year' => 2015,
                        'model' => 'CR-V',
                        'trim_level'=>array('LX','lxawd'),
                        'transmission' => 'AWD Continuously Variable ',
                        'colors' => array( 
                                        'BK' => 'Crystal Black Pearl',
                                        'BL' => 'Obsidian Blue Pearl',
                                        'CS' => 'Copper Sunset Pearl',
                                        'KC' => 'Kona Coffee Metallic',
                                        'MA' => 'Mountain Air Metallic',
                                        'MS' => 'Modern Steel Metallic',
                                        'RE' => 'Basque Red Pearl II',
                                        'SI' => 'Alabaster Silver Metallic',
                                        'UT' => 'Urban Titanium Metallic',
                                        'WH' => 'White Diamond Pearl',
                                        )
                        );
?>

这是我试图构建的类,以使其成为一个对象。不用说,我还没有走多远……

 <?php
            class OptionsBuild
            {
                public $year = 0;
                public $model = '';
                public $transmission = '';
                public $trimlevel = '';
                public $colorID = '';
                public $colorName = '';

                public function __construct($modelMap)
                {

                    $this->transmission = $transmission;
                    $this->trimlevel = $trimlevel;
                    $this->colorID = $colorID;
                    $this->colorName = $colorName;

                }

            }

            //Test area
            $obj = new OptionsBuild;

            $obj = __construct($modelMap);


            ?>

此外,每当我尝试创建一个可以执行任何操作的函数时,我都会不断收到错误消息,告诉我我的函数不存在并且表现得好像它不存在一样。这是为什么呢?

总而言之,我只是想设置一个类,让我可以输入我的多维数组,然后设置它,以便我可以添加函数/方法来获取年份、模型、修剪级别、传输,和颜色。这甚至可能吗?如果这是一个简单的解决方案,请善待,我是 PHP 新手,是编程新手,并且正在尝试创建我的第一个对象/类。

【问题讨论】:

    标签: php arrays class oop multidimensional-array


    【解决方案1】:

    Construct 是一个magic method,当你创建一个新类时会自动调用它

    删除对 __construct 的调用并在新调用中传递 $modelMap

            $obj = new OptionsBuild($modelMap);
    

    其次,我真的不知道你想对你的对象做什么,但你想为数组中的每个键创建几个对象吗?例如RM4H3FEW 是与 RM3H3FEW 不同的对象吗?

    如果是这种情况,您将在循环中创建它们,例如

    foreach ($modelMap as $model) {
        $obj = new OptionsBuild($model);
    }
    

    让我知道预期用途,我可以提供更多帮助...

    【讨论】:

    • 感谢您的回复!是的,我有超过 1000 个多维数组格式的模型代码(例如 RM4H3FEW)。就像你说的,目标是让每个型号(也就是每辆车)作为一个单独的对象......我想。我的想法是运行一个 foreach 循环,将每个模型代码(例如 RM4H3FEW)作为一个单独的对象,然后我希望能够为每个模型代码调用单独的统计数据(例如年份、模型)。我将尝试使用您发布的 foreach 示例。
    【解决方案2】:

    从您的代码中,我发现了 3 个问题。

    1. 您似乎正在将 ModelMap 数组转换为单个 OptionsBuild 类;实际上,您想创建一个类数组。
    2. 您正在存储单一颜色和修剪级别,而您想要存储它们的数组。
    3. 此外,您使用的魔术方法__construct 不正确。它在使用New Object($argumentsForConstruct) 初始化对象时执行。

    尝试将您的“测试区域”更改为:

    $models = Array()
    foreach ($modelMap as $modelArray) {
        $models[] = New OptionsBuild($modelMap)
    }
    

    遍历数组并附加到另一个数组解决了问题 1,New 语法修复了问题 3。对于问题 2,将数组属性的初始值更改为 Array() 而不是 ''

    最后,您需要将__construct 更新为$this-&gt;var = $array["var"],这将根据输入数组中的相应键设置属性。

    public function __construct($modelMap) {
        $this->year = $modelMap["year"]
        $this->model = $modelMap["model"]
        $this->trimlevel = $modelMap["trim_level"]
        //Continue for the rest of your properties
    }
    

    希望这可以让您从数组转换为 PHP OOP 对象。

    【讨论】:

      【解决方案3】:

      您似乎想使用复杂的数组和对象来解决问题,而合理地使用对象可能就是您想要的。您可以使用面向对象的原则很好地处理这个问题。多维数组很麻烦,通常很难跟踪和使用。使用对象通常是摆脱它们的好方法。

      此外,您还遇到了技术问题,因为您错误地访问了变量。例如,您尚未创建 $this->code 将引用的“代码”字段。 $this 指的是对象本身,-> 之后的任何内容都是您要访问的对象的哪一部分。在您的情况下, $this->year 引用了存储在 OptionsBuild 对象中的年份值,表达式被写入其中。

      鉴于此,我将按照我想象的您希望它如何工作的方式来构建您提供给我们的代码。希望有道理。

      OptionsBuild 对象的定义如下:

      <?php
      /**
       * User: hjorthjort
       * Date: 15-06-21
       * Time: 02:40
       */
      
          class OptionsBuild {
              public $year = 0;
              public $model = '';
              public $transmission = '';
              public $trimlevel = '';
              public $colorID = '';
              public $colorName = '';
      
              private static $colors = array( //This will always be the same, so make it a static field.
                  'BK' => 'Crystal Black Pearl',
                  'BL' => 'Obsidian Blue Pearl',
                  'CS' => 'Copper Sunset Pearl',
                  'KC' => 'Kona Coffee Metallic',
                  'MA' => 'Mountain Air Metallic',
                  'MS' => 'Modern Steel Metallic',
                  'RE' => 'Basque Red Pearl II',
                  'SI' => 'Alabaster Silver Metallic',
                  'UT' => 'Urban Titanium Metallic',
                  'WH' => 'White Diamond Pearl',
              );
      
              public function __construct($modelMap)
              {
                  $this->year = $modelMap['year'];
                  $this->model = $modelMap['model'];
      
                  $this->transmission = $modelMap['transmission'];
                  $this->trimlevel = $modelMap['trim_level'];
                  $this->colorID = $modelMap['colorID'];
      
                  $this->colorName = OptionsBuild::$colors[$this->colorID];
              }
      
          }
      

      然后modelMap-arrays是这样制作的:

      <?php
      /**
       * User: hjorthjort
       * Date: 15-06-21
       * Time: 02:38
       */
      
      $modelMap1 = array('year' => 2015,
          'model' => 'CR-V',
          'trim_level'=>array('LX','lx2wd'),
          'transmission' => '2WD Continuously Variable ',
          'colorID' => 'BK'
      );
      
      $modelMap2 = array('year' => 2015,
          'model' => 'CR-V',
          'trim_level'=>array('LX','lxawd'),
          'transmission' => 'AWD Continuously Variable ',
          'colorID' => 'CS'
      );
      
      include_once('OptionsBuild.php');
      
      $obj1 = new OptionsBuild($modelMap1);
      $obj2 = new OptionsBuild($modelMap2);
      
      $objects = array('RM3H3FEW' => $obj1, 'RM4H3FEW' => $obj2);
      
      print_r($objects); //To see what you have created thus far.
      

      注意如何使用“new”关键字创建新的 OptionsBuild,而不是通过调用 __construct(即使使用“new”完全符合我想象的通过调用 __construct 实现的目的)。

      这是 print_r 的输出。 $objects 数组现在包含两个对象,由您在顶层使用的相同字符串标识。然后每个对象依次包含有关年份、传输等的信息。

          Array
      (
      [RM3H3FEW] => OptionsBuild Object
          (
              [year] => 2015
              [model] => CR-V
              [transmission] => 2WD Continuously Variable 
              [trimlevel] => Array
                  (
                      [0] => LX
                      [1] => lx2wd
                  )
      
              [colorID] => BK
              [colorName] => Crystal Black Pearl
          )
      
      [RM4H3FEW] => OptionsBuild Object
          (
              [year] => 2015
              [model] => CR-V
              [transmission] => AWD Continuously Variable 
              [trimlevel] => Array
                  (
                      [0] => LX
                      [1] => lxawd
                  )
      
              [colorID] => CS
              [colorName] => Copper Sunset Pearl
          )
      
      )
      

      还要注意上面是如何访问数组的——通过数组名、尖括​​号 [] 和键名,比如

       $modelMap['transmission']
      

      因此,要获取数组中的第一个对象 RM3H3FEW 及其属性,您可以编写

       $variable = $objects['RM3H3FEW']; //Get the object
       $variable = $objects['RM3H3FEW'][year]; //Get the year of the object
       $variable = $objects['RM3H3FEW']['trimlevel'][1] //Get lx2wd (not sure what that is)
      

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        行: $obj = __construct($modelMap);

        错了,构造函数是在创建对象时自调用的:

        对于你的例子,它应该是谎言:

        $obj = new OptionsBuild($modelMap);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 2019-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多