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

问题描述 投票:1回答:4

我有以下代码,但我想知道如何使它更有效。

        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使用的列表中。

这段代码有效,但它的重复性和一些帮助会很棒!

php arrays performance
4个回答
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);

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);

0
投票

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

$sets = [];

if ($genres){
    $sets['genres'] = $genres;
}

if ($themes){
    $sets['themes'] = $themes;
}

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

0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.