PHP - 根据值构造多维数组

时间:2012-06-05 11:46:43

标签: php multidimensional-array structure

我有一个数组:

$initialarray = array(
  0 = array(
    'unit' => 1,
    'class' => 1,
    'value' => 'string1'
  ),
  1 = array(
    'unit' => 1,
    'class' => 2,
    'value' => 'string2'
  ),
  2 = array(
    'unit' => 1,
    'class' => 2,
    'value' => 'string3'
  ),
  3 = array(
    'unit' => 2,
    'class' => 1,
    'value' => 'string4'
  )
  4 = array(
    'unit' => 2,
    'class' => 2,
    'value' => 'string5'
  )
);

最好的结构方法是什么(将结果子阵列分组)首先取决于'单元'字段的值,然后取决于'类'字段的值,如下:

$resultarray = array(
  // array of all the sub-arrays of 'unit' = 1
  $unit[1] = array(
    // array of all the sub-arrays of 'unit' = 1 and 'class' = 1
    $class[1] = array(
      0 = array(
        'unit' => 1,
        'class' => 1,
        'value' => 'string1'
      )
    )
    // array of all the sub-arrays of 'unit' = 1 and 'class' = 2
    $class[2] = array(
      0 = array(
        'unit' => 1,
        'class' => 2,
        'value' => 'string2'
      ),
      1 = array(
        'unit' => 1,
        'class' => 2,
        'value' => 'string3'
      )
    )
  )
  // array of all the sub-arrays of 'unit' = 2
  $unit[2] = array(
    // array of all the sub-arrays of 'unit' = 2 and 'class' = 1
    $class[1] = array(
      0 = array(
        'unit' => 2,
        'class' => 1,
        'value' => 'string4'
      )
    )
    // array of all the sub-arrays of 'unit' = 2 and 'class' = 2
    $class[2] = array(
      0 = array(
        'unit' => 2,
        'class' => 2,
        'value' => 'string5'
      )
    )
  )
)

我已经问了一个类似的问题here并且只得到了一次迭代的工作答案,即仅用于通过其中一个字段构造数组。但我无法为多次迭代制作相同的解决方案,即多个字段。

此外,是否有一个解决方案来构建一个多维数组,取决于两个以上的字段?

3 个答案:

答案 0 :(得分:1)

我认为这不是提问的方式。这很简单,你可以通过玩数组,键等来实现这一点。所以首先你应该努力解决这个问题。之后如果您在尝试过程中遇到任何问题,那么您可以在此处提出要求。我在这里解决了你的问题是完整的代码,但下次请做一些工作,然后才发布问题。永远不要求代码。

foreach ($initialarray as $key1=>$val1)
{
    foreach ($val1 as $key2=>$val2)
    {            

        if($key2=='unit')
        {
            $num=$val2;
            if($val2!=$num)
            $testarr['unit'.$val2]=array();
        }
        if($key2=='class')
        {
            $testarr['unit'.$num]['class'.$val2][]=$val1;
        }

    }
}

print_r($testarr);

答案 1 :(得分:1)

我必须为您和未来的研究人员提供更好的方法...

您只需要一个循环,并且只需要在使用[]将新数据“推入”最深子数组中之前,指定结果数组的键值即可。

*绝对不需要任何条件语句或第二个循环。

代码:(Demo

$initialarray = [
  ['unit' => 1, 'class' => 1, 'value' => 'string1'],
  ['unit' => 1, 'class' => 2, 'value' => 'string2'],
  ['unit' => 1, 'class' => 2, 'value' => 'string3'],
  ['unit' => 2, 'class' => 1, 'value' => 'string4'],
  ['unit' => 2, 'class' => 2, 'value' => 'string5']
];

foreach ($initialarray as $row) {
    $result[$row['unit']][$row['class']][] = $row;
}
var_export($result);

输出:

array (
  1 => 
  array (
    1 => 
    array (
      0 => 
      array (
        'unit' => 1,
        'class' => 1,
        'value' => 'string1',
      ),
    ),
    2 => 
    array (
      0 => 
      array (
        'unit' => 1,
        'class' => 2,
        'value' => 'string2',
      ),
      1 => 
      array (
        'unit' => 1,
        'class' => 2,
        'value' => 'string3',
      ),
    ),
  ),
  2 => 
  array (
    1 => 
    array (
      0 => 
      array (
        'unit' => 2,
        'class' => 1,
        'value' => 'string4',
      ),
    ),
    2 => 
    array (
      0 => 
      array (
        'unit' => 2,
        'class' => 2,
        'value' => 'string5',
      ),
    ),
  ),
)

答案 2 :(得分:0)

如果我可以通过以下方式表达自己:我只看到问题的前端而对其后端一无所知,例如: “数据来自哪里?”,“如何收集和存储”等等,所以我的回答可能不是真正的帮助,但我仍然会给出“嘟嘟”。
如果您可以将所有数据存储在关系数据库中(以表格的形式),那么从数据库中选择所需数据而不是重新排列数组会更加容易和快速(!),这将花费更多时间相比之下 作为示例,您可以选择(并将其存储到数组中)所有具有unit = '1'的项目和/或具有class = '2'的所有项目。这将使生活变得更容易恕我直言,而不是在多维数组中拥有所有数据,然后尝试对其进行排序/重新排列。特别是如果你基于多个财产这样做。