Отменить точечный массив с подстановочными знаками в LaravelPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Отменить точечный массив с подстановочными знаками в Laravel

Сообщение Anonymous »

В Laravel я создаю карту JSON, где мне нужно преобразовать JSON в другую схему. Для этого я выполняю следующие действия:
  • Расставьте точки над массивом с помощью помощника Arr::dot. Вот такой результат, пример:

Код: Выделить всё

array(11) {
["0.identificador"]=>
int(1)
["0.nome_completo"]=>
string(8) "John Doe"
["0.email"]=>
string(11) "[email protected]"
["0.empresa.razao_social"]=>
string(11) "ABC Company"
["0.empresa.endereco"]=>
string(11) "123 Main St"
["0.pedidos.0.SKU"]=>
int(1)
["0.pedidos.0.descricao"]=>
string(5) "Shoes"
["0.pedidos.0.qtd"]=>
int(2)
["0.pedidos.1.SKU"]=>
int(2)
["0.pedidos.1.descricao"]=>
string(5) "Shirt"
["0.pedidos.1.qtd"]=>
int(1)
}
  • Пройдите по пунктирному массиву и сравните с моей картой ключей. Если они совпадают, я устанавливаю значение с помощью сопоставленного ключа.
Мое сопоставление выглядит следующим образом:

Код: Выделить всё

array(8) {
["*.identificador"]=> string(4) "*.id"
["*.nome_completo"]=> string(6) "*.name"
["*.empresa"]=> string(9) "*.company"
["*.empresa.razao_social"]=> string(14) "*.company.name"
["*.empresa.endereco"]=> string(17) "*.company.address"
["*.pedidos.*.SKU"]=> string(13) "*.orders.*.id"
["*.pedidos.*.descricao"]=> string(18) "*.orders.*.product"
["*.pedidos.*.qtd"]=> string(19) "*.orders.*.quantity"
}
А вот как сейчас выглядит мой код:

Код: Выделить всё

$payload = [
[
"identificador" => 1,
"nome_completo" => "John Doe",
"email" => "[email protected]",
"empresa" => [
"razao_social" => "ABC Company",
"endereco" => "123 Main St"
],
"pedidos" => [
[
"SKU" => 1,
"descricao" => "Shoes",
"qtd" => 2
],
[
"SKU" => 2,
"descricao" => "Shirt",
"qtd" => 1
]
]
]
];

$dottedPayload = Arr::dot($payload);

$transformedPayload = [];
foreach ($dottedPayload as $key => $value) {
$newKey = preg_replace('/\d+./', '*.', $key);
$newKey = preg_replace('/\.\d+\./', '.*.', $newKey);
$newKey = preg_replace('/\.\d+$/', '.*', $newKey);

$mappedKey = $mappingConfig[$newKey] ?? $key;

data_fill($transformedPayload, $mappedKey, $value);
}
У меня есть следующий результат:

Код: Выделить всё

array(2) {
["*"]=>
array(4) {
["id"]=>
int(1)
["name"]=>
string(8) "John Doe"
["company"]=>
array(2) {
["name"]=>
string(11) "ABC Company"
["address"]=>
string(11) "123 Main St"
}
["orders"]=>
array(1) {
["*"]=>
array(3) {
["id"]=>
int(2)
["product"]=>
string(5) "Shirt"
["quantity"]=>
int(1)
}
}
}
[0]=>
array(1) {
["email"]=>
string(11) "[email protected]"
}
}
Но это ожидаемо:

Код: Выделить всё

$expectedResult = [
[
"id" => 1,
"name" => "John Doe",
"email" => "[email protected]",
"company" => [
"name" => "ABC Company",
"address" => "123 Main St"
],
"orders" => [
[
"id" => 1,
"product" => "Shoes",
"quantity" => 2
],
[
"id" => 2,
"product" => "Shirt",
"quantity" => 1
]
]
]
];
Как правильно отменить разметку массива после сопоставления с помощью подстановочных знаков и правильно установить индексы? Любые другие предложения по выполнению сопоставления JSON также приветствуются.


Подробнее здесь: https://stackoverflow.com/questions/782 ... in-laravel
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»