如何设置PHP类以从多维数组中读取?

时间:2015-06-21 00:22:04

标签: php arrays class oop multidimensional-array

我需要一些外界的帮助,以便弄明白我是否会理解如何做到这一点......

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

这是我的阵列的一小部分片段,因此您可以看到我正在使用的结构。

<?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',
                                        )
                        );
?>

这里是I级尝试构建以使其成为对象。毋庸置疑,我还没有走得太远......

 <?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的新手,对编程不熟悉,我正在尝试创建我的第一个对象/类。

4 个答案:

答案 0 :(得分:1)

构造是magic method,当您创建新类时会自动调用它

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

        $obj = new OptionsBuild($modelMap);

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

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

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

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

答案 1 :(得分:1)

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

此外,您遇到技术问题,因为您正在错误地访问变量。例如,您尚未创建“代码”字段,$ this-&gt;代码将引用该字段。 $ this指的是对象本身,以及 - &gt;之后的任何内容。是您要访问的对象的哪个部分。在您的情况下,$ this-&gt; 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)

希望这有帮助。

答案 2 :(得分:1)

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

  1. 您似乎正在将ModelMap数组转换为单个OptionsBuild类;实际上,你想创建一个类数组。
  2. 您正在存储单个颜色和修剪级别,而您希望存储它们的数组。
  3. 此外,您正在使用魔法__construct不正确。使用New Object($argumentsForConstruct)初始化对象时执行。
  4. 尝试更改您的测试区域&#34;对此:

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

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

    最后,您需要将''更新为__construct,这将根据输入数组中的相应键设置属性。

    $this->var = $array["var"]

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

答案 3 :(得分:0)

行:    $ obj = __construct($ modelMap);

错误,构造函数在创建对象时自我调用:

你的例子应该是谎言:

$obj = new OptionsBuild($modelMap);