首页 > 解决方案 > 转换数组php

问题描述

我想知道我是否可以将数组从状态 1 转换为状态 2,如下例所示。

状态 1(示例)

array(5) { 
        [0]=> array(10) { 
                ["id"]=> "6" 
                ["name"]=> "peter" 
                ["date"]=> "2020-09-25" 
                ["sleep"]=> "20" 
                ["pain"]=> "30"...
        [1]=> array(10) { 
                ["id"]=> "6" 
                ["name"]=> "peter" 
                ["date"]=> "2020-09-26" 
                ["sleep"]=> "80" 
                ["pain"]=> "90"...
        [2]=> array(10) { 
                ["id"]=> "10" 
                ["name"]=> "john" 
                ["date"]=> "2022-09-25" 
                ["sleep"]=> "25" 
                ["pain"]=> "15"...
        [3]=> array(10) { 
                ["id"]=> "10" 
                ["name"]=> "john" 
                ["date"]=> "2022-09-25" 
                ["sleep"]=> "55" 
                ["pain"]=> "65"...
        [4]=> array(10) { 
                ["id"]=> "6" 
                ["name"]=> "peter" 
                ["date"]=> "2020-09-27" 
                ["sleep"]=> "40" 
                ["pain"]=> "60"...

ID = 6Name = peter出现 3 次和ID = 10出现Name = john2 次。

状态 2

array(2){
        [0]=>array() {
                ['id']=> "6" 
                ['name']=>"peter" 
                ["dates" => [2020-09-25, 2020-09-26, 2020-09-27]] 
                ["sleeps" => [20, 80, 40]] 
                ["pains" => [30, 90, 60]]
        [1]=>array() {
                ['id']=> "10" 
                ['name']=>"john" 
                ["dates" => [2022-09-25, 2022-09-25]] 
                ["sleeps" => [25, 55]] 
                ["pains" => [15, 65]]
}

这个想法是有一个只有一次相同ID和相同名称的数组,然后是具有相同字段值的数组,例如

(id => 1, name => kevin, [dates => [date1, date2, date3]], [sleep => s1, s2, s3]]

来自同一用户。

ID = 6andName = peter出现 1 次和ID = 10andName = john出现 1 次,但每个都有自己的数据。

我希望我是可以理解的。

标签: phparraysstringfunctionloops

解决方案


是的你可以。由于您id似乎是独一无二的,因此迭代它并使用您的id索引作为主索引创建新数组,您可以使用array_key_exists()来执行此操作。毕竟它应该是这样的:

array(2){
        [6]=>array() {
                ['id']=> "6" 
                ['name']=>"peter" 
                ["dates" => [2020-09-25, 2020-09-26, 2020-09-27]] 
                ["sleeps" => [20, 80, 40]] 
                ["pains" => [30, 90, 60]]
        [10]=>array() {
                ['id']=> "10" 
                ['name']=>"john" 
                ["dates" => [2022-09-25, 2022-09-25]] 
                ["sleeps" => [25, 55]] 
                ["pains" => [15, 65]]
}

那是 5 分钟的工艺,我很确定你会自己做。

<?php
$data = [
    [
        'id'    => '6',
        'name'  => 'peter',
        'date'  => '2020-09-25',
        'sleep' => '20',
        'pain'  => '30'
    ],
    [
        'id'    => '6',
        'name'  => 'peter',
        'date'  => '2020-09-26',
        'sleep' => '80',
        'pain'  => '90',
    ],
    [
        'id'    => '10',
        'name'  => 'john',
        'date'  => '2022-09-25',
        'sleep' => '25',
        'pain'  => '15',
    ],
    [
        'id'    => '10',
        'name'  => 'john',
        'date'  => '2022-09-25',
        'sleep' => '55',
        'pain'  => '65',
    ],
    [
        'id'    => '6',
        'name'  => 'peter',
        'date'  => '2020-09-27',
        'sleep' => '40',
        'pain'  => '60'
    ]
];

$newArr = [];

foreach ($data as $oldItem) {
    $id = $oldItem['id'];
    if (!array_key_exists($id, $newArr)) {
        $newArr[$id] = [
            'id'    => $id,
            'name'  => $oldItem['name'],
            'dates' => [$oldItem['date']],
            'sleeps' => [$oldItem['sleep']],
            'pains'  => [$oldItem['pain']],
        ];
    } else {
        $newArr[$id]['dates'][] = $oldItem['date'];
        $newArr[$id]['sleeps'][] = $oldItem['sleep'];
        $newArr[$id]['pains'][] = $oldItem['pain'];
    };
}

echo "<pre>JSON:\n";
echo json_encode($newArr, JSON_PRETTY_PRINT);
echo "\n\nprint_r():\n";
print_r($newArr);

推荐阅读