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


How to automate foreach in php and check if created arrays are empty?

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

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
}

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

谢谢!

我猜您在CheckMetric类中犯了两个错误。

首先对$valueArray进行迭代,但需要$metricArray中的特定度量名称作为关键字。切换回路。首先在CCD_ 3上并且在$valueArray上的内循环中。

在类中,您设置了不存在的属性。是的,这是有效的,但如果你用例如"metric2"设置一个属性,那么神奇的getter __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] 
            : [];
    }
}

执行$this->$metric=。。。意思是你制作一个局部变量,类似于$metric。但是如果您移除$this->**$**度量中的额外$,那么是的,这是类的一个属性。您应该通过以下操作修改该物业对公众的可见性:

public $metric;

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

在类中,但不在函数内部。因此:类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;
    }
}

您也可以使用函数。