php - 创建数组?

时间:2009-12-23 03:18:24

标签: php arrays multidimensional-array

我已经“继承”了一些我想要清理的数据。该数组来自一个显然没有密钥的数据库。

数组本身很长,所以我简化了这篇文章的内容......

[0] => Array
        (
            [id] => 2
            [uid] => 130
            [eid] => 8
            [ename] => Standard
            [eaction] => Check
        )
[1] => Array
        (
            [id] => 2
            [uid] => 110
            [eid] => 8
            [ename] => Standard
            [eaction] => Check
        )
[2] => Array
        (
            [id] => 2
            [uid] => 200
            [eid] => 8
            [ename] => Standard
            [eaction] => Check
        )

我正在尝试改变方向,因此数组是多维的,并按照ename进行分组:

[0] => Array
        (
            [Standard] => Array
            (
                 [id] => 2
                 [uid] => 130
                 [eid] => 8
                 [eaction] => Check
             ) 
        )
[0] => Array
        (
            [Standard] => Array
            (
                 [id] => 2
                 [uid] => 130
                 [eid] => 8
                 [eaction] => Check
             ) 
        )
[0] => Array
        (
            [Standard] => Array
            (
                 [id] => 2
                 [uid] => 130
                 [eid] => 8
                 [eaction] => Check
             ) 
        )

任何人都知道如何做这样的事情?

5 个答案:

答案 0 :(得分:1)

$outputarray = array();

foreach($inputarray as $value) {
  $outputarray[] = array($value['ename'] => $value);
}

会完成你的例子似乎表明的事情(除了你的'结果'例子有多个东西都是关键0的事实......这是无效的。我假设你打算给他们编号0,1 ,2等等)。但是,我不得不怀疑你从中获得了什么好处,因为它似乎正在做的是添加另一个没有用处的维度。如果还有其他事情需要考虑,你或许可以澄清一下你的例子吗?

答案 1 :(得分:1)

您可以使用usort()按用户定义的函数对数组进行排序。该函数可以比较ename字段。然后,这只是一个简单的转变。像:

usort($array, 'cmp_ename');

function cmp_ename($a, $b) {
  return strcmp($a['ename'], $b['ename']);
}

然后:

$output = array();
foreach ($array as $v) {
  $ename = $v['ename'];
  unset($v['ename']);
  $output[] = array($ename => $v);
}

答案 2 :(得分:0)

$outputarray = array();

foreach($inputarray as &$value) {
  $outputarray[][$value['ename']] = $value;
  unset($value['ename']);
} unset($value);

答案 3 :(得分:0)

我猜这就是你所要求的:

function array_group_by($input, $field) {
  $out = array();
  foreach ($input as $row) {
    if (!isset($out[$row[$field]])) {
      $out[$row[$field]] = array();
    }
    $out[$row[$field]][] = $row;
  }
  return $out;
}

用法:

var_dump(array_group_by($input, 'ename'));

答案 4 :(得分:0)

philfreo是对的,但他也有点偏僻。每当你遇到一个带有['ename']的数组元素与你已经完成的数组相同时,他的代码将使用相同的['ename']

覆盖前一个元素的数据 你可能想做这样的事情:

$output = array();
foreach ($YOURARRAY as $value) {
    $output[$value['ename']][] = $value;
}
var_dump($output); // to check out what you get