@aliaksandr-go

Как можно укоротить код в foreach?

Добрый вечер, подскажите пожалуйста как можно укоротить код в foreach, так как массив большой, каждый ключ вбивать, так себе удовольствие.
array = [];
    foreach ($babysitters as $babysitter) {
            $babysitterData = new \stdClass;
            $babysitterData->babysitter_id = $babysitter->id;
            $babysitterData->babysitter_name = $babysitter->name;
            $babysitterData->babysitter_photo = $babysitter->photo;
            array[] = $babysitterData;
   }

Есть возможность такой структуры что то, мы изменяем объект по ключам, которые нам надо (или новые ключи со значением добавляем) и закидываем в массив с тем что было + то что изменил?
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
/**
 * Переделать массив объектов, добавив префикс названию каждого из свойств
 * @param array<object> $srcArray исходный массив объектов
 * @param string $prefix строка, которую добавить перед названием каждого из свойств
 */
$remap = fn (array $srcArray, string $prefix) => array_map(
    function ($obj) use ($prefix) {
        $keyValues = get_object_vars($obj);
        $keys = array_keys($keyValues);
        $values = array_values($keyValues);
        return (object) array_combine(
            array_map(fn ($key) => $prefix . $key, $keys),
            $values
        );
    },
    $srcArray
);


Test
// Test
$babySitters = [
    (object) ['a'=>'A1', 'b'=>'B-1'],
    (object) ['a'=>'A2', 'b'=>'B-2'],
    (object) ['a'=>'A3', 'b'=>'B-3'],
    (object) ['a'=>'A4', 'b'=>'B-4', 'c'=>'C4'],
];

$result = $remap($babySitters, 'babysitter_');

echo json_encode($result);


Результат:
[
  {
    "babysitter_a": "A1",
    "babysitter_b": "B-1"
  },
  {
    "babysitter_a": "A2",
    "babysitter_b": "B-2"
  },
  {
    "babysitter_a": "A3",
    "babysitter_b": "B-3"
  },
  {
    "babysitter_a": "A4",
    "babysitter_b": "B-4",
    "babysitter_c": "C4"
  }
]

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
grantur5707
@grantur5707
Full Stack Web Developer
Ты можешь эти ключи вынести в отдельный массив и не перечислять их в foreach:

$array = [];
$requiredKeys = ['id', 'name', 'photo'];

foreach ($babysitters as $babysitter) {
    $babysitterData = new \stdClass;

    foreach ($requiredKeys as => $key) {
        $babysitterData->${'babysitter_' . $key} = $babysitter->$key;
    }

    $array[] = $babysitterData;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы