【问题标题】:php - recreate array?php - 创建数组?
【发布时间】:2009-12-23 03:18:24
【问题描述】:

我“继承”了一些数据,我正在尝试清理这些数据。该数组来自一个显然没有键的数据库。

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

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

有人知道怎么做这样的事情吗?

【问题讨论】:

  • 您能进一步解释一下吗?什么是“标准”,什么时候有更多?您想知道如何将当前数组转换为新数组还是只创建新数组?
  • 你的第二个例子真的没有意义。 ID 是重复的(全为 0),我不会将其描述为多维的。请澄清。

标签: php arrays multidimensional-array


【解决方案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】:
    $outputarray = array();
    
    foreach($inputarray as $value) {
      $outputarray[] = array($value['ename'] => $value);
    }
    

    将完成您的示例似乎表明的内容(除了您的“结果”示例有多个带有键 0 的东西......这是无效的。我假设您打算将它们编号为 0,1 ,2 等等)。但是,我不得不想知道您从中获得了什么好处,因为它似乎所做的只是添加了另一个无用的维度。如果还有其他需要考虑的事情,也许您可​​以澄清一下您的示例?

    【讨论】:

      【解决方案3】:
      $outputarray = array();
      
      foreach($inputarray as &$value) {
        $outputarray[][$value['ename']] = $value;
        unset($value['ename']);
      } unset($value);
      

      【讨论】:

        【解决方案4】:

        我猜这就是你要的:

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

        【讨论】:

          【解决方案5】:

          philfreo 是对的,但他也有点不对劲。使用他的代码,每次遇到具有 ['ename'] 的数组元素与您已经经历过的数组元素相同时,它将覆盖具有相同 ['ename'] 的前一个元素的数据

          你可能想做这样的事情:

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

          【讨论】:

            猜你喜欢
            • 2013-10-29
            • 1970-01-01
            • 1970-01-01
            • 2020-06-17
            • 2016-06-12
            • 2012-01-29
            • 2018-05-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多