PHP: создать подмассив на основе похожих типов значений - PullRequest
0 голосов
/ 20 мая 2018

Привет сообществу: в следующем массиве я хотел бы собрать все хобби одного и того же пользователя под именем этого пользователя в подмассив, который я бы назвал хобби.

Мое текущее решение состоит в том, чтобысравните, является ли значение электронной почты одинаковым для обоих массивов, и если да, то поместите хобби в собственный массив.

Проблема в том, что циклы кажутся правильными, но не дают результатов, которые я ожидаю, и я не вижу, в чем проблема.Я благодарю вас всех за ваше время.

    for($x = 0; $x <= count($majorArray); $x++) {
       if($majorArray[$x]['email'] == $majorArray[$x+1]['email'])
             array_push($hobbies, $majorArray[$x]['hobby']);
}

Массив:

Массив (

[1] => Array
    (
        [fname] => Eli
        [lname] => Solo
        [hobby] => plants
        [id] => 1
        [email] => elis@elis.com
    )

[2] => Array
    (
        [fname] => Eli
        [lname] => Solo
        [hobby] => hiking
        [id] => 1
        [email] => elis@elis.com
    )

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Просто напишите новый массив и используйте идентификатор в качестве ключа

$betterArray = array();
foreach($majorArray as $data){
 $betterArray[$data['id']]['fname']     = $data['fname'];
 $betterArray[$data['id']]['lname']     = $data['lname'];
 $betterArray[$data['id']]['email']     = $data['email'];
 $betterArray[$data['id']]['hobbies'][] = $data['hobby'];
}

обратите внимание на [] в последней строке цикла, чтобы добавлять новый элемент в подмассив каждый раз, когда он повторяет цикл

0 голосов
/ 20 мая 2018

Проблема с вашим кодом состоит в том, что вы сравниваете электронную почту с текущим содержимым с электронной почтой следующего.

Эта проверка не проверяет, присутствует ли уже пользователь, а просто проверяет следующего пользователя вмассив.Это будет работать только в том случае, если следующий пользователь также является текущим, а не если между ними что-то есть.

Кроме того, этот код в конечном итоге выдаст вам ошибку undefined index, поскольку он попытается извлечь данные вследующий ключ в последней итерации.

Также неясно, откуда $hobbies, согласно вашему объяснению, вы хотите создать массив hobbies и добавить туда все данные.

Вы можете попробовать следующее (не проверено):

<?php

$majorArray = [
    [
        'fname' => 'Eli',
        'lname' => 'Solo',
        'hobby' => 'plants',
        'id' => 1,
        'email' => 'elis@elis.com',
    ],
    [
        'fname' => 'Eli',
        'lname' => 'Solo',
        'hobby' => 'hiking',
        'id' => 1,
        'email' => 'elis@elis.com',
    ],
];

$output = [];

foreach ($majorArray as $userData) {
    // check if email already exists as key, you can also just use id for this
    if (!array_key_exists($userData['email'], $output)) {
        $newUserData = [
            'fname' => $userData['fname'],
            'lname' => $userData['lname'],
            'id' => $userData['id'],
            'email' => $userData['email'],
            'hobbies' => [], // create the hobbies array
        ];

        // add the newly created user data array to the output with email as key
        $output[$userData['email']] = $newUserData;
    }

    // append the hobby to the hobbies array
    $output[$userData['email']]['hobbies'][] = $userData['hobby'];
}

// array_values will reset the array keys if you need to
print_r(array_values($output));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...