如何根据 PHP 中的数组键将数组分解为子数组


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

我有一个从多个表单提交中获得的数组,我必须根据键将此数组拆分为子数组

我从多个表单提交中获得的数组是:

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
)

我想将上面的数组分解为如下所示的子数组,我的意思是从name_1到country_1一个数组,然后再次name_4 country_4另一个数组,依此类推。 我从多个表单提交中动态获取此数组

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
        )
)

这是我尝试过的:

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

您开始正确,但是在拆分密钥后您从未执行任何操作。设置变量不会将其添加到结果数组中。

$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
}

最终,我觉得这个问题是一个XY问题,应用程序错过了更好地构建数据的好机会。

若要解决此次优设计,请分析键并使用隔离的子字符串来构造新的更深层次的结构。

PHP 数组在将数据推送到它们之前不需要声明 - 只要您使用[]推送语法即可。

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