在php

时间:2017-08-16 18:20:33

标签: php arrays

我遇到了具体的问题,我有2个阵列:

其中一个从订单数据中提取特定字段,它会迭代并提取id,title,amount和price,这是当前订单中产品的数量,因此看起来像这样:

$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变量中的每个子数组映射前四个值,并且我还需要拥有尽可能多的子数组,因为许多产品按当前顺序排列,在这方面它应该像第一个数组一样工作。

我查看了这个问题: create multidimensional array using a foreach loop

但是不能完全达到目标,那么实现这一目标的代码怎么样呢?

4 个答案:

答案 0 :(得分:0)

<?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
        )

)

答案 1 :(得分:0)

您可以使用一系列原生函数:

$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
        )

)

答案 2 :(得分:0)

你可以在count(数组)上做一段时间 我使用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);

https://3v4l.org/7Gt5k

答案 3 :(得分:0)

在输出数组中定义所需的键。

$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。)