PHP: Как создать хорошую стенографию foreach? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть простой объект ( или массив ), подобный этому ...

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)

И он будет делать то же самое только с 1 короткой строкой кода , как это делали мои 3 строки кода foreach.

Есть ли такая функция или как мы могли бы создать такую ​​функцию?

Ответы [ 6 ]

0 голосов
/ 12 сентября 2018

Самый короткий и не слишком уродливый способ - добавить метод __ toString к объекту Person следующим образом:

class Person {
    public $name;

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

Это позволит вам затем использоватьочень супер короткий:

array_walk($people, 'printf');

Синтаксис.

0 голосов
/ 12 сентября 2018

Если бы мне пришлось написать функцию для этого, это было бы что-то вроде этого:

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 />"
0 голосов
/ 12 сентября 2018

Если вы хотите стать «умным», вы можете написать что-то вроде этого:

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

Но быть умным над удобочитаемостью - это всегда плохая идея.

0 голосов
/ 12 сентября 2018

Если у вас есть массив, вы можете использовать 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"
}
0 голосов
/ 12 сентября 2018

Вы можете использовать array_column и implode.

echo implode("<br>\n", array_column($arr, "name"));
0 голосов
/ 12 сентября 2018

Вероятно, array_map ближе всего к тому, что вы хотите.

array_map(function($person) { echo $person->name; }, $people);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...