Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP对象数组获取密钥_Php_Arrays_Class_Object_Key - Fatal编程技术网

PHP对象数组获取密钥

PHP对象数组获取密钥,php,arrays,class,object,key,Php,Arrays,Class,Object,Key,我正在为一个小项目研究对象和数组如何在PHP中工作。不幸的是,很难找到处理数据的好方法,有很多解决方案,但我无法找到解决问题的正确方法。我想我更喜欢两个人一起工作 我有两个与此示例相关的问题: class cars {} $cars = new cars(); $cars->brand = new cars(); $cars->brand->audi = "A6"; $cars->brand->opel = "insignia"; 问题1我如何获得每个品牌

我正在为一个小项目研究对象和数组如何在PHP中工作。不幸的是,很难找到处理数据的好方法,有很多解决方案,但我无法找到解决问题的正确方法。我想我更喜欢两个人一起工作

我有两个与此示例相关的问题:

class cars {}

$cars = new cars();  

$cars->brand = new cars();
$cars->brand->audi = "A6";
$cars->brand->opel = "insignia";
问题1我如何获得每个品牌作为输出,例如使用for each循环或其他函数

回音解决方案将给奥迪

问题2是否有一种类似于使用括号的数组编写代码而不重复$cars->brand->opel的方法


问题3为什么我需要创建类cars?

在类中没有属性的情况下访问属性非常困难

您可能需要的是一个阵列:

$cars = array(); // Or [] in PHP 5.4 and greater
$cars['brand']['audi'] = 'A6';
$cars['brand']['opel'] = 'Insignia';

// Printing
foreach($cars['brand'] as $brand => $model) {
    echo $brand . ': '. $model;
}
回答#1:

PHP5为对象提供了一种遍历项目列表的方法,例如:foreach语句

  • 简单:
foreach($key=>对象和$value){
//...
}
此外,您还可以对对象使用:

  • 迭代器接口
  • 发电机>=5.5.0-

    样本:

回答#2:

请参阅阵列:

$cars->brand=array(
“奥迪”=>“A6”,
“欧宝”=>“徽章”,
);
foreach($cars->brand as$name=>$model){…}
回答#3:


使用新的stdClass()如果你想使用匿名对象

,不管你的方式是绝对可能的,当然也不难做到更通用,这在面向对象设计方面也是非常不正确的

品牌应该是一个完全不同的对象。在您的设计中,您将一个全新的卡实例注入到当前的Cars实例中,仅用于指定属性。为此,可以使用标准类对象
stdClass

使用foreach环绕您的品牌对象(汽车),您将获得作为钥匙的财产名称
奥迪
欧宝
,以及其车型的价值

foreach ($cars->brand as $name => $value) {
    echo $name . ' ' . $value . "<br />";
}
这导致了

Audi A6
Opel Vectra
Opel insignia

另一种方法是将新模型对象注入cars对象。这几乎就是您所做的,但是您的
brand
属性将接收的不是超类,而是模型类(或品牌类)

这样,您可以在这两个对象中提供用于迭代或仅用于打印的接口。模型和汽车

class Car {
    /*
     * @var Model
     */
    private $_models;

    public function setModel(Model $model) {
        $this->_models[] = $model;
    }

    public function getModels() {
        return $this->_models;
    }

    public function getModelsByCar($car) {
        foreach ($this->getModels() as $model) {
            if ($model->getCarName() == $car) {
                $models[] = $model;
            }
        }
        return $models;
    }

    public function getCarByModel($modelName) {
        foreach ($this->getModels() as $model) {
            if ($model->getModelname() == $modelName) {
                return $model->getCarName();
            }
        }
    }
}

class Model {
    private $_carName;
    private $_modelName;
    public function __construct($name, $model) {
        $this->_carName = $name;
        $this->_modelName = $model;
    }

    public function getCarName() {
        return $this->_carName;
    }

    public function getModelName() {
        return $this->_modelName;
    }
}   

$cars = new Car();
$cars->setModel(new Model('Audi', 'A6'));
$cars->setModel(new Model('Audi', 'V8'));
$cars->setModel(new Model('Audi', 'A8'));   
$cars->setModel(new Model('Opel', 'insignia'));
$cars->setModel(new Model('Opel', 'vectra'));

foreach ($cars->getModels() as $model) {
    echo $model->getCarName() . ' ' .$model->getModelName() . "<br/>";
}

echo "-----------------------------<br/>";

foreach ($cars->getModelsByCar('Audi') as $model) {
    echo $model->getModelName() . "<br />";
}

echo "-----------------------------<br/>";

echo $cars->getCarByModel('insignia');
class Car {
    /*
     * @var Model
     */
    private $_models;

    public function setModel(Model $model) {
        $this->_models[] = $model;
    }

    public function getModels() {
        return $this->_models;
    }

    public function getModelsByCar($car) {
        foreach ($this->getModels() as $model) {
            if ($model->getCarName() == $car) {
                $models[] = $model;
            }
        }
        return $models;
    }

    public function getCarByModel($modelName) {
        foreach ($this->getModels() as $model) {
            if ($model->getModelname() == $modelName) {
                return $model->getCarName();
            }
        }
    }
}

class Model {
    private $_carName;
    private $_modelName;
    public function __construct($name, $model) {
        $this->_carName = $name;
        $this->_modelName = $model;
    }

    public function getCarName() {
        return $this->_carName;
    }

    public function getModelName() {
        return $this->_modelName;
    }
}   

$cars = new Car();
$cars->setModel(new Model('Audi', 'A6'));
$cars->setModel(new Model('Audi', 'V8'));
$cars->setModel(new Model('Audi', 'A8'));   
$cars->setModel(new Model('Opel', 'insignia'));
$cars->setModel(new Model('Opel', 'vectra'));

foreach ($cars->getModels() as $model) {
    echo $model->getCarName() . ' ' .$model->getModelName() . "<br/>";
}

echo "-----------------------------<br/>";

foreach ($cars->getModelsByCar('Audi') as $model) {
    echo $model->getModelName() . "<br />";
}

echo "-----------------------------<br/>";

echo $cars->getCarByModel('insignia');
Audi A6
Audi V8
Audi A8
Opel insignia
Opel vectra
-----------------------------
A6
V8
A8
-----------------------------
Opel