结合两个foreach循环以获得更好的低效率?

时间:2017-12-28 17:39:42

标签: php arrays performance

我有以下代码,但我想知道如何才能提高效率。

        if ($genres){

            $arr = array();

            foreach ($genres as $i) {
                $arr[] = $i->name;
            }

            $genres_arr = $arr;

        }

        if ($themes){

            $arr = array();

            foreach ($themes as $i) {
                $arr[] = $i->name;
            }

            $themes_arr = $arr;

        }

       var_dump($genres_arr);
       var_dump($themes_arr);

我已经尝试将它们放入if语句中,但因为它们始终只存在于第一个运行中。我想检查两者是否存在并始终通过foreach循环运行它们。如果只存在一个,我只想运行一个。

这些是数组结构。

 ["genres"]=>
    array(1) {
      [0]=>
      object(stdClass)#1579 (2) {
        ["id"]=>
        int(25)
        ["name"]=>
        string(26) "Hack and slash/Beat 'em up"
      }
    }

     ["themes"]=>
        array(3) {
          [0]=>
          object(stdClass)#1576 (2) {
            ["id"]=>
            int(1)
            ["name"]=>
            string(6) "Action"
          }
}

我想让他们像在对象里面那样受宠若惊。然后我将它们内爆到WordPress使用的列表中。

此代码有效,但重复性和一些帮助会很棒!

4 个答案:

答案 0 :(得分:3)

我认为你可以使用array column,因为它可以像"A multi-dimensional array or an array of objects from which to pull a column of values from"这样读取值:

    if ($genres) {
        $genres_arr = array_column($genres, 'name');
    }

    if ($themes) {
        $themes_arr = array_column($themes, 'name');
    }

   var_dump($genres_arr);
   var_dump($themes_arr);

答案 1 :(得分:0)

通过这种方式,最简单的简化是引入一个新函数,构建数组。

function getNames($arr) {
    if (!is_array($arra)) return false;
    return array_map(function($item) {
        return $item->name;
    }, $arr);
}

$themes_arr = getNames($themes);
$genre_arr = getNames($genres);

答案 2 :(得分:0)

这就是我将它们结合起来的方式

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
    -files gs://bucket-name/intro_to_mapreduce/mapper_prod_cat.py,gs://bucket-name/intro_to_mapreduce/reducer_prod_cat.py \
    -mapper mapper_prod_cat.py \
    -reducer reducer_prod_cat.py \
    -input gs://bucket-name/intro_to_mapreduce/purchases.txt \
    -output gs://bucket-name/intro_to_mapreduce/output_prod_cat

答案 3 :(得分:0)

claudio 的答案非常适合这种情况,但在更一般的情况下,您还可以定义一个映射函数,然后将其与array_map一起用于两个集合对象,例如

$mapper = function ($item) { return $item->name; };

$genres_arr = array_map($mapper, $genres);
$themes_arr = array_map($mapper, $themes);

如果您将来需要它,它的优点是能够运行更复杂的逻辑(使用getter函数而不是直接属性访问等)。

理想情况下,两个对象都会实现一个公共接口,因此很清楚地确定了映射函数的设计对象类型。