如何在php中自动化foreach并检查创建的数组是否为空?

时间:2016-07-26 19:44:31

标签: php arrays

我的应用程序中有很多foreaches,我想自动执行该过程,并检查创建的数组是否为空。所以,基本上这是我的旧代码:

foreach ($array as $a) {
    $arr1[] = $a->metric
    $arr2[] = $a->metric2
}

然后:

if (!empty($arr1)) {
    // do stuff with $arr1
}

我认为一个带有__construct和__get的课可能有所帮助。所以,这是我的方法:

class CheckMetric  {

function __contruct($valueArray, $metricArray) {
    foreach ($valueArray as $value) {
        foreach ($metricArray as $metric) {
            $metrics[] = $value->$metric;    
        }
        $this->$metric = $metrics;
    }
}

function __get($metric) {
    if (empty($this->$metric)) {
        return false;
    } else {
        return true;
    }
}

public function returnMetric($metric) {
    return $this->$metric;
}

}

现在我以为我能够做到这一点:

$metricArray = ['metric1', 'metric2', 'metric3'];
$valueArray = Model::find(); // data from my model

$checkMetric = new CheckMetric($valueArray, $metricArray);

if ($checkMetric->metric1) {
    // do stuff with $checkMetric->metric1
}

但我不是!我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

做$ this-> $ metric = ...意味着你制作一个局部变量,类似$ metric。 但如果您删除$ this-> ** $ **指标中的额外$,则为yes,该类的属性。 并且您应该通过执行以下操作来修改属性对公众的可见性:

public $metric;

http://php.net/manual/en/language.oop5.visibility.php

在类中但不在函数内部

。 所以:     class CheckMetric {

    public $metric;

    public function __contruct($valueArray, $metricArray) {
        foreach ($valueArray as $value) {
            foreach ($metricArray as $metric) {
                $metrics[] = $value->$metric;    
            }
            $this->metric = $metrics;
       }
   }

    public function __get($metric) {
        if (empty($this->$metric)) {
            return false;
        } else {
            return true;
        }
    }

    public function returnMetric($metric) {
        return $this->$metric;
    }
}

您也可以使用functions

答案 1 :(得分:0)

我猜你的CheckMetric课程有两个错误。

首先迭代$valueArray但您需要$metricArray中的特定指标名称作为关键字。切换循环。首先是$metricArray,而是内圈$valueArray

在课堂上设置不存在的属性。是的,这是有效的,但如果您设置一个属性,例如" metric2",魔法吸气剂__get将不再执行。因此,请使用受保护/私有阵列作为度量存储。

<?php

class CheckMetric {

    /** @var array */
    protected $metrics = [];

    /**
     * @param string[] $valueArray
     * @param string[] $metricArray
     */
    function __construct($valueArray, $metricArray)
    {
        foreach ($metricArray as $metric) {
            $metrics = [];

            foreach ($valueArray as $value) {
                $metrics[] = $value->$metric;
            }

            $this->metrics[$metric] = $metrics;
        }
    }

    /**
     * @param string $metric
     * @return bool
     */
    function __get($metric)
    {
        return isset($this->metrics[$metric]);
    }

    /**
     * @param string $metric
     * @return array
     */
    public function returnMetric($metric)
    {
        return isset($this->metrics[$metric])
            ? $this->metrics[$metric] 
            : [];
    }
}