PHP:基于类似的值类型创建子数组

时间:2018-05-20 17:21:48

标签: php arrays key

社区的问候:在下面的数组中,我想将该用户名下同一用户的所有爱好收集到一个我称之为爱好的子阵列中。

我目前的解决方案是比较两个数组的电子邮件值是否相同,如果是,则将业余爱好推送到自己的数组中。

问题是循环似乎正确,但不会产生我期望的结果,我无法看到问题所在。我感谢你们所有的时间。

    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
    )

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是您将当前内容的电子邮件与下一封电子邮件的电子邮件进行比较。

此检查不检查用户是否已经存在,它只检查数组中的下一个用户。这仅在下一个用户也是当前用户时才有效,而不是在两者之间存在某种情况。

此外,此代码最终会给您一个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));