<?php
$catalog = new stdClass();
$catalog->product = new stdClass();
$catalog->product->item = 'Short';
$catalog->product->model = 'Adidas';
$catalogPaths = ['product.item', 'product.model'];
function extractValuesByPath(object $obj, array $paths) {
return array_reduce($paths, function(array $values, string $pattern) use($obj) {
$values[] = extractPathValue($obj, $pattern);
return $values;
}, []);
}
function extractPathValue($obj, $pattern) {
$paths = explode('.', $pattern);
foreach($paths as $path) {
if (!property_exists($obj, $path)) {
// Можно нулл вернуть или к пример `undefined $path`
throw new InvalidArgumentException('Нет такого свойства во входящих данных!');
}
$obj = $obj->$path;
}
return $obj;
}
$res = extractValuesByPath($catalog, $catalogPaths);
var_dump($res);
// [
// 'Short',
// 'Adidas',
// ]
A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.
A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.
A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.
[
"aaa",
"bbb",
"1234"
]
ObjectNormalizer
или GetSetMethodNormalizer
, раз решили через сеттеры/геттеры с сущностями работать$obj = $this->normalizer->denormalize($data, YourEntity::class);
<?php
// Ваши данные в упрощенном виде (без мусора)
$array = [
'numbers' => [
[
'numbers' => [
[
'formattedValue' => 111,
],
[
'formattedValue' => 3333,
],
[
'formattedValue' => 5555,
],
],
],
[
'numbers' => [
[
'formattedValue' => 200111,
],
[
'formattedValue' => 2003333,
],
[
'formattedValue' => 2005555,
],
],
],
],
];
// Найдет все значения во всех вложенных элементах с нужным ключом
// и сделает это рекурсивно — то есть во всех массивах и их детях.
function searchValues(array $arr, string $search, array $res = []): array {
array_walk_recursive($arr, function($value, $key) use (&$res, $search) {
if ($key === $search) {
$res[] = $value;
}
});
return $res;
}
// Ищем в нашем массиве все значения с ключом `formattedValue`
// и складываем найденные значения в пустой массив (по дефолту),
// но можно передать 3-м параметром и имеющийся массив, тогда значения туда добавятся.
$result = searchValues($array, 'formattedValue')
var_dump($result);
<?php
$data = [
[
'id' => 4,
],
[
'id' => 1,
'start' => 1,
'end' => 50,
'parent_id' => 4,
],
[
'id' => 1,
'start' => 10,
'end' => 50,
'parent_id' => 4,
],
[
'id' => 1,
'start' => 5,
'end' => 100,
'parent_id' => 4,
],
];
function aggregateExtremumBorders(array $elements) {
return array_reduce($elements, function($res, $element) {
if (!isset($element['parent_id'])) {
return $res;
}
$parentId = $element['parent_id'];
$parent = $res[$parentId] ?? ['id' => $parentId, 'min' => null, 'max' => null];
$parent['min'] = min($parent['min'], $element['start']) ?: $element['start'];
$parent['max'] = max($parent['max'], $element['end']) ?: $element['end'];
$res[$parentId] = $parent;
return $res;
}, []);
}
var_dump(aggregateExtremumBorders($data));
то как быть с ситуацией, когда в некоторых модулях должны производиться сложные выборки с фильтрами, агрегацией, затрагивающие сущности (entity) других модулей?
А в чем подвох? Почему без round не работает?
$date1 = Carbon::createMidnightDate(2016, 1, 5); // <-- тут любой способ создания объекта
$date2 = Carbon::createMidnightDate(2017, 3, 15);
echo $date1->diffInDays($date2); // 435
echo $date1->diffInWeekdays($date2); // 311
echo $date1->diffInWeekendDays($date2); // 124
echo $date1->diffInWeeks($date2); // 62
echo $date1->diffInMonths($date2); // 14
echo $date1->diffInQuarters($date2); // 4
echo $date1->diffInYears($date2); // 1
<?php
$now = new DateTime();
$date = new DateTime('2020-05-10');
$diff = $date->diff($now)->format("%a");
var_dump($diff);