У меня есть конкретные проблемы, у меня есть 2 массива:
Одна, которая извлекает определенные поля из данных заказа, выполняет итерацию и извлечение идентификатора, названия, суммы и цены столько раз, сколько товаров находится в текущем заказе, поэтому выглядит это так:
$array1 = array( 'id_1' => '2975', 'title_1' => 'first_title', 'amount_1' => '1', 'price_1' => 55, 'id_2' => '2973', 'title_2' => 'second_title', 'amount_2' => '1', 'price_2' => 95, )
Есть 2 товара в заказе, если бы их было 3, был бы другой набор значений, поэтому у меня есть другой массив, в который я хотел бы отобразить значения, он должен быть точно в этой форме (он переносится на другой веб-сайт, поэтому он получает данные только в этой форме):
$products = Array(
Array
(
'id' => 'first_id',
'title' => 'first_title',
'amount' => 'first_amount',
'price' => 'first_price',
'type' => 0,
'installmenttype' => 0
),
Array
(
'id' => 'second_id',
'title' => 'second_title',
'amount' => 'second_amount',
'price' => 'second_price',
'type' => 0,
'installmenttype' => 0
)
);
Мне нужно отобразить первые четыре значения для каждого вложенного массива в переменной $ products, и мне также нужно иметь столько вложенных массивов, сколько продуктов находится в текущем порядке, в этом отношении он должен работать как первый массив.
Я просмотрел этот вопрос:
создать многомерный массив с помощью цикла foreach
Но не мог добраться до цели, так как должен выглядеть код, который достигает этого?
Определите ключи, которые вы хотите в выходном массиве.
$keys = ['id', 'title', 'amount', 'price', 'type', 'installmenttype'];
Тогда карта array_combine
более 4-х частей вашего исходного массива.
$products = array_map(function($product) use ($keys) {
return array_combine($keys, array_merge($product, [0,0]));
}, array_chunk($array1, 4));
(array_merge
добавляет нулевые значения для дополнительных ключей, чтобы array_combine
может быть использован.)
<?php
$array1 = array( 'id_1' => '2975', 'title_1' => 'first_title', 'amount_1' => '1', 'price_1' => 55, 'id_2' => '2973', 'title_2' => 'second_title', 'amount_2' => '1', 'price_2' => 95, );
$products = [];
if (!empty($array1)) {
foreach ($array1 as $key => $val) {
list($property,$id) = explode('_',$key);
$id--; // make it zero based
if (!isset($products[$id])) $products[$id] = [];
$products[$id][$property] = $val;
}
}
print_r($products);
в результате чего
Array
(
[0] => Array
(
[id] => 2975
[title] => first_title
[amount] => 1
[price] => 55
)
[1] => Array
(
[id] => 2973
[title] => second_title
[amount] => 1
[price] => 95
)
)
Вы можете использовать ряд нативных функций:
$new = array_map(function($v) {
foreach($v as $key => $value) {
unset($v[$key]);
$key = preg_replace('/\_[0-9]{1,}/','',$key);
$v[$key] = $value;
}
return $v;
},array_chunk($array1,4,true));print_R($new);
Дает тебе:
Array
(
[0] => Array
(
[id] => 2975
[title] => first_title
[amount] => 1
[price] => 55
)
[1] => Array
(
[id] => 2973
[title] => second_title
[amount] => 1
[price] => 95
)
)
Вы можете сделать некоторое время на счет (массив).
Я использую array_splice, чтобы вырезать первые четыре элемента в новый массив.
$array1 = array('id_0' => '2975', 'title_0' => 'first_title', 'amount_0' => '1', 'price_0' => 55, 'id_1' => '2975', 'title_1' => 'first_title', 'amount_1' => '1', 'price_1' => 55, 'id_2' => '2973', 'title_2' => 'second_title', 'amount_2' => '1', 'price_2' => 95, );
$res =array();
While(count($array1)){
$res[] = array_splice($array1, 0,4);
}
Var_dump($res);