Разбить массив объектов на новые массивы в PHP на основе свойства объекта - PullRequest
0 голосов
/ 01 октября 2018

Как можно сгенерировать массив массивов объектов, где они сгруппированы, на основе свойства объекта 'name'?Я могу сделать это в Javascript, но не уверен, как это сделать в PHP.

Вот пример фрагмента текущего вывода эхона json_encoded:

[
    {"id":14970,
    "amount":"70",
    "name":"Food"
    },
    {"id":14970,
    "amount":"100",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"100",
    "name":"Food"
    },
    {"id":14970,
    "amount":"300",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"10",
    "name":"Taxi"
    },
    {"id":14970,
    "amount":"200",
    "name":"Food"
    }
]

Вот желаемый результат:

[
    [
        {"id":14970,
        "amount":"70",
        "name":"Food"
        },
        {"id":14970,
        "amount":"100",
        "name":"Food"
        },
        {"id":14970,
        "amount":"200",
        "name":"Food"
        }
    ],
    [
        {"id":14970,
        "amount":"100",
        "name":"Drink"
        },
        {"id":14970,
        "amount":"300",
        "name":"Drink"
        }
    ],
    [
        {"id":14970,
        "amount":"10",
        "name":"Taxi"
        }
    ]
]

Был бы очень признателен, если бы решение было объяснено, поскольку мои знания по PHP ограничены, и хотел бы узнать, как это работает для использования в будущем и использования PHP.

Ответы [ 4 ]

0 голосов
/ 01 октября 2018
 $json_string = '[
    {"id":14970,
    "amount":"70",
    "name":"Food"
    },
    {"id":14970,
    "amount":"100",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"100",
    "name":"Food"
    },
    {"id":14970,
    "amount":"300",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"10",
    "name":"Taxi"
    },
    {"id":14970,
    "amount":"200",
    "name":"Food"
    }
]';
        $array = json_decode($json_string, true);
        $result = array();
        if (count($array) > 0) {
            foreach ($array as $value) {
                $name = $value['name'];

                $result[$name][] = $value;
            }
        }
        echo '<pre>';
        print_r(array_values($result));
0 голосов
/ 01 октября 2018

Использовать имя в массиве в качестве группы (ключа) многомерного массива.

$array = json_decode('[
{"id":14970,
"amount":"70",
"name":"Food"
},
{"id":14970,
"amount":"100",
"name":"Drink"
},
{"id":14970,
"amount":"100",
"name":"Food"
},
{"id":14970,
"amount":"300",
"name":"Drink"
},
{"id":14970,
"amount":"10",
"name":"Taxi"
},
{"id":14970,
"amount":"200",
"name":"Food"
}
]',true);

$result = [];
foreach($array as $key=>$value){
    $group = $value['name'];
    if(!isset($result[$group])) $result[$group ] = [];

    $result[$group][] = $value;
}

//remove the top level keys, it's easier to build it with them
$result = array_values($result); 

Выход

 array (
  0 => 
  array (
    0 => 
    array (
      'id' => 14970,
      'amount' => '70',
      'name' => 'Food',
    ),
    1 => 
    array (
      'id' => 14970,
      'amount' => '100',
      'name' => 'Food',
    ),
    2 => 
    array (
      'id' => 14970,
      'amount' => '200',
      'name' => 'Food',
    ),
  ),
  1 => 
  array (
    0 => 
    array (
      'id' => 14970,
      'amount' => '100',
      'name' => 'Drink',
    ),
    1 => 
    array (
      'id' => 14970,
      'amount' => '300',
      'name' => 'Drink',
    ),
  ),
  2 => 
  array (
    0 => 
    array (
      'id' => 14970,
      'amount' => '10',
      'name' => 'Taxi',
    ),
  ),
)

Песочница

Тогда вам просто нужно json_encode это.

 $result = [];
 foreach($array as $key=>$value){
     $group = $value['name'];
     if(!isset($result[$group])) $result[$group ] = [];

     $result[$group][] = $value;
 }

 echo json_encode(array_keys($result), JSON_PRETTY_PRINT);

Что дает:

[
    [
        {
            "id": 14970,
            "amount": "70",
            "name": "Food"
        },
        {
            "id": 14970,
            "amount": "100",
            "name": "Food"
        },
        {
            "id": 14970,
            "amount": "200",
            "name": "Food"
        }
    ],
    [
        {
            "id": 14970,
            "amount": "100",
            "name": "Drink"
        },
        {
            "id": 14970,
            "amount": "300",
            "name": "Drink"
        }
    ],
    [
        {
            "id": 14970,
            "amount": "10",
            "name": "Taxi"
        }
    ]
]

Песочница

0 голосов
/ 01 октября 2018

Вышеупомянутый массив объекта выглядит как формат JSON.Я преобразовал в массив и сгруппировал его.пожалуйста, попробуйте это, это может быть полезно для вас:)

<code>$objStr = '[
    {"id":14970,
    "amount":"70",
    "name":"Food"
    },
    {"id":14970,
    "amount":"100",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"100",
    "name":"Food"
    },
    {"id":14970,
    "amount":"300",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"10",
    "name":"Taxi"
    },
    {"id":14970,
    "amount":"200",
    "name":"Food"
    }
]';
$arr = json_decode($objStr,true);
$arrArr = array();
foreach($arr as $k => $arrOfArr) {
    $arrArr[$arrOfArr['name']][] = $arrOfArr;
}
echo "<pre>"; print_r($arrArr); echo "
";
0 голосов
/ 01 октября 2018
<code><?php
$array = json_decode('[
    {"id":14970,
    "amount":"70",
    "name":"Food"
    },
    {"id":14970,
    "amount":"100",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"100",
    "name":"Food"
    },
    {"id":14970,
    "amount":"300",
    "name":"Drink"
    },
    {"id":14970,
    "amount":"10",
    "name":"Taxi"
    },
    {"id":14970,
    "amount":"200",
    "name":"Food"
    }
]',true);

$types = [];
$splited = [];

foreach($array as $key => $value){
    // searching types for the type
    if(in_array($value['name'],$types)){
        // adding it to splited with the correct key if type exists
        $splited[array_search($value['name'],$types)][] = $value;
    } else {
        // creating a new type if not exists
        $types[] = $value['name'];
        $splited[] = [$value];
    }
}

echo '<pre>';
var_dump($splited);
echo '
';?>
...