【问题标题】:PHP: How to create a good foreach shorthand?PHP:如何创建一个好的 foreach 速记?
【发布时间】:2019-02-17 05:00:43
【问题描述】:

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

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 代码所做的完全相同只需 1 行代码

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

【问题讨论】:

  • 为什么?永远不应低估可读性。如果必须,请编写一个函数/方法。
  • 用于测试/调试目的。这样的函数怎么写?
  • 把foreach放到一个函数中?

标签: php loops foreach


【解决方案1】:

array_map 可能最接近你想要的。

array_map(function($person) { echo $person->name; }, $people);

【讨论】:

  • 还是太长了,能不能写个更短的函数?
  • 当然! array_map(function($p) { echo $p-&gt;name; }, $people); 怎么样 ;-)
【解决方案2】:

您可以使用 array_column 和 implode。

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

【讨论】:

    【解决方案3】:

    最简单且不那么难看的方法是添加一个 __toString Person 对象的方法如下:

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

    这使您可以使用非常短的:

    array_walk($people, 'printf');
    

    语法。

    【讨论】:

    • 在这种情况下看起来它们只是 StdClass 对象,但总的来说我认为这是个好主意!
    【解决方案4】:

    如果你有数组,你可以使用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"
    }
    

    【讨论】:

    • 这很好,但仅适用于数组而不是对象
    • @MartinZeltin array_column 适用于对象数组,除非您仍在使用 PHP 5。
    • 这正是我需要的
    【解决方案5】:

    PHP 7.4 开始,您可以:

    echo implode('', array_map(fn($person) => $person->name . '<br>', $people));
    
    1. 内部array_map() 函数将您的初始数组$people作为第二个参数
    2. 内部array_map() 函数将第一个参数作为箭头函数fn() =&gt;,用于从初始数组$people 中获取单个项目$person
    3. 在箭头函数内,每个 $person->name 都与 '&lt;br&gt;' 连接,并作为值写入新数组中。
    4. 这个新数组将由array_map() 函数返回
    5. 此数组的项将作为第二个参数传递给implode() 函数,并与空字符串'' 粘合在一起。
    6. implode() 返回的整个字符串被 echo 删除

    【讨论】:

      【解决方案6】:

      如果你想“聪明”一点,你可以这样写:

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

      但在可读性上保持聪明总是一个坏主意。

      【讨论】:

        【解决方案7】:

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

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

        可以这样使用:

        $people = [
          (object)[
            "name" => "Bob",
            "age" => 25
          ],
          (object)[
            "name" => "Dan",
            "age" => 31
          ],
          (object)[
            "name" => "Sally",
            "age" => 45
          ]
        ];
        
        print_each($people, "name"); // prints "Bob<br />Dan<br />Sally<br />"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-14
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 1970-01-01
          • 2019-09-14
          相关资源
          最近更新 更多