2015-06-21 54 views
-1

我需要一些外部的帮助,以便弄清楚,如果我要去了解如何做到这一点...如何设置PHP类以从多维数组中读取?

我有一个多维数组,我试图建立一个这样的类我可以将它用作对象,以便我可以动态调用它的一部分。

这里是我的数组的一个小片段,所以你可以看到我正在使用的结构。

<?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的新手,对编程新手,并试图创建我的第一个对象/类。

回答

1

构建体是magic method当你做一个新的类

删除通话在新呼叫

 $obj = new OptionsBuild($modelMap); 

其次,我真的不知道该怎么__construct并通过$ modelMap时,自动调用你正在试图处理你的对象,但是你想为数组中的每个键创建几个对象?例如RM4H3FEW是RM3H3FEW的独立对象?

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

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

让我知道用途,我可以帮助更多...

+0

感谢您的回应!是的,我有超过1000个模型代码(例如RM4H3FEW),它们是多维数组格式。 就像你说的,我们的目标是让每个型号(又名每辆车)作为一个独立的对象......我想。 我的想法是运行一个foreach循环,将每个modelcode(例如RM4H3FEW)作为一个独立的对象,并从那里我想能够调用每个modelcode的个人统计(例如年,模型)。 我将尝试使用您发布的foreach示例。 – Josh979

0

行: $ OBJ = __construct($ modelMap);

是错误的,构造函数是自它们对象被创建时称为:

为你的榜样应该是liek:

$obj = new OptionsBuild($modelMap); 
1

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

此外,您遇到技术问题,因为您正在访问错误的变量。例如,您尚未创建$ code->代码将引用的“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-阵列被这样制成:

<?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. 

注新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) 

希望这有助于。

1

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

  1. 看来你正在将一个ModelMap数组转换为一个OptionsBuild类;在现实中,你想创建一个类的数组。
  2. 您正在存储单个颜色和trimlevel,而您想要存储它们的数组。
  3. 此外,您正在使用不正确的神奇方法__construct。当对象使用New Object($argumentsForConstruct)进行初始化时,它会执行。

试着改变你的“试验区”,以这样的:

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

阵列上的循环,并追加到另一个阵列解决问题1,New语法修正问题3.对于问题2,更改数组属性的初始值为Array()而不是''

最后,您需要将您的__construct更新为$this->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对象。