0

我有一个数组:

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

我在这里问了一个类似的问题,并且只得到了一次迭代的有效答案,即仅通过其中一个字段来构造数组。但是我无法使相同的解决方案适用于多次迭代,即适用于多个领域。

另外,是否有一种解决方案可以根据两个以上的字段来构造多维数组?

4

3 回答 3

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);
于 2012-06-05T13:00:45.017 回答
1

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

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

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

代码:(演示

$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',
      ),
    ),
  ),
)
于 2018-08-26T13:50:58.087 回答
0

如果我可以用以下方式表达自己:我只看到你的问题的前端,对它的后端一无所知,例如“数据来自哪里?”,“它是如何收集和存储的”等.所以我的回答可能没有真正的帮助,但我仍然会给出我的“tuppence”。
如果您可以将所有数据存储在关系数据库中(以表的形式),那么从数据库中选择所需的数据而不是重新排列数组会更容易和更快(!),这将需要更多时间相比下。
举个例子,您可以选择(并将其存储到数组中)所有具有的项目unit = '1'和/或所有具有class = '2'. 恕我直言,这将使生活更容易,而不是将所有数据放在多维数组中,然后尝试对其进行排序/重新排列。特别是如果您基于多个属性执行此操作。

于 2012-06-05T12:43:49.657 回答