Php 结合两个foreach循环以提高效率?

Php 结合两个foreach循环以提高效率?,php,arrays,performance,Php,Arrays,Performance,我有下面的代码,但我想知道如何使它更有效 if ($genres){ $arr = array(); foreach ($genres as $i) { $arr[] = $i->name; } $genres_arr = $arr; } if ($themes){ $arr =

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

        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使用


这段代码可以工作,但它的重复性和一些帮助将是伟大的

以这种方式,最简单的简化是引入一个新函数,用于构建数组

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

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

$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;
    }
}

我认为您可以使用
数组列
,因为它可以像这样读取值:

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

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

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

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

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

$genres_arr = array_map($mapper, $genres);
$themes_arr = array_map($mapper, $themes);
这样做的好处是,如果将来需要,可以运行更复杂的逻辑(使用getter函数而不是直接属性访问等)


理想情况下,两个对象都将实现一个公共接口,这样就可以清楚地知道映射函数是为什么类型的对象设计的。

请添加数组和预期结果。如果没有两个循环,就无法实现。它可以减少重复性,但仍然需要两个循环。如果这是其中一个数组的有效索引,则可以获得这两个数组的最大计数,并仅添加,但这会使代码难以读取,因此可能最小的性能优势是不值得的。也许只需要创建一个函数,为一个对象执行任务并返回一个数组。传入一次主题以获取第一个数组。传递类型以获得第二个。您的代码将具有很高的可读性。@Philipp自PHP7以来,是的,请听我说,simplezWow,这看起来可能会简单得多!我会试一试,不过可能需要先升级到PHP7。