PHP:如何创建一个很好的foreach速记?

时间:2018-09-12 14:05:01

标签: php loops foreach

我有一个像这样的简单对象(或数组)...

stdClass Object (
[people] => Array
(
    [0] => stdClass Object (
        [name] => 'John',
        [age] => 50,
    )

    [0] => stdClass Object (
        [name] => 'Martin',
        [age] => 47,
    )
)

我可以使用这样的foreach轻松遍历它

foreach ($people as $person) {
    echo $person->name . '<br>';
}

但是我想以某种更短的方式来用这样的方式呼应所有名称...

print_each($people->name)

仅用一小段代码就能完成与我的3行foreach代码完全相同的事情。

是否有这样的函数,或者我们将如何创建这样的函数?

6 个答案:

答案 0 :(得分:4)

可能... | time="2018-09-12T14:03:48Z" level=debug msg="originLabelsmap[com.docker.stack.namespace:cs-api com.docker.stack.image:redis]" ... | time="2018-09-12T14:03:48Z" level=debug msg="allLabelsmap[:map[]]" ... | time="2018-09-12T14:03:48Z" level=debug msg="Filtering container without port, cs-api_redis.1: port label is missing, please use traefik.port as default value or define port label for all segments ('traefik.<segment_name>.port')" ... | time="2018-09-12T14:03:48Z" level=debug msg="originLabelsmap[com.docker.stack.image:traefik com.docker.stack.namespace:cs-api]" ... | time="2018-09-12T14:03:48Z" level=debug msg="allLabelsmap[:map[]]" ... | time="2018-09-12T14:03:48Z" level=debug msg="Filtering container without port, cs-api_loadbalancer.1: port label is missing, please use traefik.port as default value or define port label for all segments ('traefik.<segment_name>.port')" 最接近您想要的内容。

array_map

答案 1 :(得分:4)

您可以使用array_column并进行爆破。

echo implode("<br>\n", array_column($arr, "name"));

答案 2 :(得分:2)

最短的方法(不是最丑陋的方法)是添加一个 __ toString 这样的Person对象的方法:

class Person {
    public $name;

    public function __toString()
    {
        return (string) $this->name;
    }
}

然后,您可以使用超短格式:

array_walk($people, 'printf');

语法。

答案 3 :(得分:1)

如果有数组,则可以使用array_column

$people = [
    ['name' => 'John', 'age' => 3],
    ['name' => 'Carl', 'age' => 43]
];

var_dump(
    array_column($people, 'name') 
);

 /*
array(2) {
  [0]=>
  string(4) "John"
  [1]=>
  string(4) "Carl"
}

答案 4 :(得分:0)

如果您想对此“智能”,可以编写如下内容:

 array_walk_recursive($a, function($v, $k) {echo $k === 'name' ? $v : '';});

但是对可读性保持精明总是一个坏主意。

答案 5 :(得分:0)

如果我必须编写一个函数来做到这一点,那将是这些事情:

WinForms

可以这样使用:

function print_each($collection, $property) {
  foreach ($collection as $item) {
    echo $item->$property . "<br />";
  }
}