获取多维数组以基于索引值创建新数组

时间:2014-02-11 16:19:39

标签: php arrays multidimensional-array

我正在度过这段艰难的时光我现在已经挣扎了几个小时。有人可以帮帮我吗?我添加了fiddle

我相信我的问题出现在这个字符串中:

        $$salesAndOwner[$i]["$salesAndOwner[$i]".$l] = $salesAndOwner[$i.$l][$param] = $values[$l];

基本上我有以下多维数组:

[sales] => Array
        (
            [FirstName] => Array
                (
                    [0] => salesFirst1
                    [1] => salesFirst2
                )

            [LastName] => Array
                (
                    [0] => salesLast1
                    [1] => salesLast2
                )

        )

    [decisionmaker] => Array
        (
            [FirstName] => Array
                (
                    [0] => dmFirst1
                    [1] => dmFirst2
                )

            [LastName] => Array
                (
                    [0] => dmLast1
                    [1] => dmLast2
                )

        )

)

我需要对此进行重组,就像我使用以下数组一样:

Array
(
    [additionallocations0] => Array
        (
            [Address] => Address1
            [State] => State1
        )

    [additionallocations1] => Array
        (
            [Address] => Address2
            [State] => State2
        )

)

以下是原文:

Array
(
    [additionallocations] => Array
        (
            [Address] => Array
                (
                    [0] => Address1
                    [1] => Address2
                )

            [State] => Array
                (
                    [0] => State1
                    [1] => State2
                )

        )

这是我重组上述数组的方式:

if(isset($_POST['additionallocations'])) {
        $qty = count($_POST['additionallocations']["Address"]);

        for ($l=0; $l<$qty; $l++)
        {
            foreach($_POST['additionallocations'] as $param => $values)
            {
                $additional['additionallocations'.$l][$param] = $values[$l];
            }
        }

这就是我用于sales and decisionmaker数组的内容。如果您注意到我有一个包含salesdecisionmaker的数组。我希望能够通过添加其主要数组名称来排序任何未来的数组。我觉得我已接近解决我的问题,但我无法让它产生正确的。

$salesAndOwner = array(0 => "sales", 1 => "decisionmaker");

for($i = 0; $i < 2; $i++){
$qty = count($_POST[$salesAndOwner[$i]]["FirstName"]);

        for ($l=0; $l<$qty; $l++)
        {
            foreach($_POST[$salesAndOwner[$i]] as $param => $values)
            {
                            $$salesAndOwner[$i]["$salesAndOwner[$i]".$l] = $salesAndOwner[$i.$l][$param] = $values[$l];
            }
        }
}

在上面的代码中,我将“sales”硬编码到变量中我需要它来动态生成包含sales0 decisionmaker0sales1 decisionmaker1数组的变量名称所以$sales$decisionmaker 我希望这有意义,如果您需要更多信息请告诉我

3 个答案:

答案 0 :(得分:1)

尝试

$result =array();

foreach($arr as $key=>$val){

    foreach($val as $key1=>$val1){
        foreach($val1 as $key2=>$val2){
           $result[$key.$key2][$key1] = $val2;
         }
    }
}

请参阅演示here

答案 1 :(得分:1)

$salesAndOwner = array("sales", "decisionmaker");

$result = array();
foreach ($salesAndOwner as $key) {
    $group = $_POST[$key];
    $subkeys = array_keys($group);
    $first_key = $subkeys[0];
    foreach ($group[$first_key] as $i => $val) {
        $prefix = $key . $i;
        foreach ($subkeys as $subkey) {
            if (!isset($result[$prefix])) {
                $result[$prefix] = array();
            }
            $result[$prefix][$subkey] = $val;
        }
    }
}

DEMO

答案 2 :(得分:1)

让我们分解吧。 Using friendly variable names and spacing will make your code a lot easier to read

记住。语法适用于以便轻松阅读和理解。 (甚至不仅仅是你,但也许是未来的开发人员!)

所以你有一组人。每个组都包含一组属性。每个属性行都包含许多属性值。

PHP's foreach是一种很好的迭代方法,因为你需要迭代(并使用)数组的索引名称:

<?php

$new_array = array();

// For each group:

foreach($original_array as $group_name => $group) {

    // $group_name = e.g 'sales'

    // For each attribute in this group:

    foreach($group as $attribute_name => $attributes) {

        // $attribute_name = e.g. 'FirstName'

        // For each attribute value in this attribute set.

        foreach($attributes as $row_number => $attribute) {

            // E.g. sales0
            $row_key = $group_name . $row_number;

            // if this is the first iteration, we need to declare the array.
            if(!isset($new_array[$row_key])) {
                $new_array[$row_key] = array();
            }

            // e.g. Array[sales0][FirstName]
            $new_array[$row_key][$attribute_name] = $attribute;

        }

    }

}

?>

有了这样说,如果没有充分的验证,这种转换可能会导致意想不到的结果。

确保输入数组有效(例如,每个属性组每组具有相同的行数),您应该没问题。