简体   繁体   中英

how to break an array into sub arrays based on array key in php

I have the array below which I get from multiple form submission, i have to split this array into sub arrays based on the keys

My array which i get from multiple form submission is:

Array
(
    [name_1] => sam
    [email_1] => sam@gmail.com
    [adress_1] => #224,us-west
    [phone_1] => 0144875954
    [city_1] => sanfransico
    [state_1] => us
    [country_1] => us
    [name_4] => ram
    [email_4] => ram@gmail.com
    [adress_4] => #444,india
    [phone_4] => 9844875954
    [city_4] => delhi
    [state_4] => delhi
    [country_5] => india
    [name_5] => jam
    [email_5] => jam@gmail.com
    [adress_5] => #224,cannada
    [phone_5] => 0344875954
    [city_5] => sanfransico
    [state_5] => cannada
    [country_5] => cannada
    [name_7] => kam
    [email_7] => kam@gmail.com
    [adress_7] => #224,us-east
    [phone_7] => 0144875954
    [city_7] => california
    [state_7] => us
    [country_7] => us

)

i want to break above array into sub arrays like below,i mean from name_1 to country_1 one array and again name_4 to country_4 another array like so on.. i am getting this array dynamically from multiple form submission

Array
(
    [0] => Array
        (
            [name] => sam
            [email] => sam@gmail.com
            [adress] => #224,us-west
            [phone] => 0144875954
            [city] => sanfransico
            [state] => sanfransico
            [country] => us
        )

    [1] => Array
        (
            [name] => ram
            [email] => ram@gmail.com
            [adress] => #444,india
            [phone] => 9844875954
            [city] => delhi
            [state] => delhi
            [country] => india
        )

    [2] => Array
        (
            [name] => jam
            [email] => jam@gmail.com
            [adress] => #224,cannada
            [phone] => 0344875954
            [city] => sanfransico
            [state] => cannada
            [country] => cannada
        )

    [3] => Array
        (
            [name] => kam
            [email] => kam@gmail.com
            [adress] => #224,us-east
            [phone] => 0144875954
            [city] => california
            [state] => us
            [country] => us
        )
)

This is what I have tried:

foreach ($arr as $k_fmt => $v_fmt) { 
    $arr_fetch = explode("_", $k_fmt, 2); 
    $ele_key = $arr_fetch[0]; 
}

You started correctly, but then you never did anything after splitting up the key. Setting a variable won't add it to the result array.

$new_arr = array();
foreach ($arr as $k_fmt => $v_fmt) {
    $arr_fetch = explode("_", $k_fmt, 2); // Split up they key at the _ character
    $ele_key = arr_fetch[0];
    $ele_index = arr_fetch[1] - 1; // Because original keys start at 1, not 0
    if (!isset($new_arr[$ele_index])) { // Create sub-array if necessary
        $new_arr[$ele_index] = array();
    }
    $new_arr[$ele_index][$ele_key] = $v_fmt; // Use the split up key as the indexes in 2-dimensional result
}

Ultimately, I feel this question is an XY Problem where the application is missing a good opportunity to better structure the data.

To work around this suboptimal design, parse the keys and use the isolated substrings to construct the new, deeper structure.

PHP arrays do not need to be declared before pushing data into them -- so long as you use [] push syntax.

$result = [];
foreach ($array as $key => $value) {
    sscanf("%[^_]_%d", $key, $word, $id);
    $result[$id][$word] = $value;
}
var_export(array_values($result));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM