【问题标题】:How to group multidimensional array by sub-array value in and reassign keys in PHP如何通过子数组值对多维数组进行分组并在PHP中重新分配键
【发布时间】:2017-05-05 09:57:28
【问题描述】:

我查看了所有类似的问题和示例(有很多),但仍然无法使其正常工作(尽管我认为我很接近)。

我有一组从文本文件中提取的员工时间表...

schedule.txt:

123,乔,20120208,0845,1645 123,乔,20120209,0800,1600 456,苏,20120208,0900,1700 456,苏,20120209,0700,1500 ...

我生成数组的代码是:

$schedule = file_get_contents('./schedule.txt'); $s = explode("\n", $schedule); 对于 ($i = 0; $i

输出是:

大批 ( [0] => 数组 ( [0] => 123 [1] => 乔 [2] => 20120208 [3] => 0845 [4] => 1645 ) [1] => 数组 ( [0] => 123 [1] => 乔 [2] => 20120209 [3] => 0800 [4] => 1600 ) [2] => 数组 ( [0] => 456 [1] => 苏 [2] => 20120208 [3] => 0900 [4] => 1700 ) [3] => 数组 ( [0] => 456 [1] => 苏 [2] => 20120209 [3] => 0700 [4] => 1500 ) )

我试图在一个新的多维数组中按 ID 对员工进行分组,输出如下:

大批 ( [123] => 数组 ( [0] => 数组 ( [0] => 乔 [1] => 20120208 [2] => 0845 [3] => 1645 ) [1] => 数组 ( [0] => 乔 [1] => 20120209 [2] => 0800 [3] => 1600 ) ) [456] => 数组 ( [0] => 数组 ( [0] => 苏 [1] => 20120208 [2] => 0900 [3] => 1700 ) [1] => 数组 ( [0] => 苏 [1] => 20120209 [2] => 0700 [3] => 1500 ) ) )

我一生都无法思考如何将现有数组更改为这个新的(不同的)输出...... 我正在尝试这个但一无所获:

$newArr = 数组(); foreach($s as $k => $v) { if(!isset($newArr[$v[0]])) { $newArr[$v[0]] = array(); } $newArr[$v[0]][] = array($v[0]); }

虽然我现在的输出是:

大批 ( [123] => 数组 ( [0] => 数组 ( [0] => 123 ) [1] => 数组 ( [0] => 123 ) ) [456] => 数组 ( [0] => 数组 ( [0] => 456 ) [1] => 数组 ( [0] => 456 ) ) )

有什么想法吗?我知道我的代码中缺少某些内容:

$newArr[$v[0]][] = array($v[0]);

我尝试将其更改为:

$newArr[$v[0]][] = 数组(0 => $v[1], 1 => $v[2], 2 => $v[3], 3 => $v[4]) ;

这给了我正确的输出,但我现在得到未定义的偏移错误。另外,如果子数组中的键数发生变化,这段代码现在仅限于我明确输入的 4 个...

【问题讨论】:

    标签: php multidimensional-array grouping


    【解决方案1】:

    如果我理解正确的话,这就足够了:)

    $lines = file('./schedule.txt');
    
    $employees = array();
    foreach ($lines as $line)
    {
        $chunks = explode(',', $line);
        $employees[$chunks[0]][] = array_slice($chunks, 1);
    }
    
    print_r($employees);
    

    【讨论】:

      【解决方案2】:

      有一个名为fgetcsv 的函数可以轻松获取逗号分隔值。不需要自己做。

      此代码还解决了您的问题并正确处理空行:

      if (($handle = fopen("schedules.csv", "r")) !== FALSE) {
      
          $schedules = array();
          while (($data = fgetcsv($handle)) !== FALSE) {
              if ($data[0] !== null) { //blank lines return an array containing null
                  $schedules[$data[0]][] = array_slice($data, 1);
              }
          }
          fclose($handle);
      
          //do what you need to
      
      } else {
          // file failed to open
      }
      

      请注意,我将文件命名为 .csv 而不是 .txt。我建议您将逗号分隔值的内容保存为 .csv 文件。甚至可以定义文件中每一列的内容。

      【讨论】:

        【解决方案3】:
        <?php
        //read the file into an array with each line being an entry
        $schedule = file('./schedule.txt');
        //empty array
        $s = array();
        //loop through file lines
        foreach($schedule as $row){
            //explode on comma
            $row = explode(",", trim($row));
            //if the id doesn't exist yet...
            if(!isset($s[$row[0]])){
                //...make it an empty array
                $s[$row[0]] = array();
            }
            //add the row under the id
            $s[$row[0]][] = $row;
        }
        print_r($s);
        ?>
        

        【讨论】:

          【解决方案4】:

          你可以使用fscanf:

          $handle    = fopen('./schedule.txt', 'r');
          $employees = array();
          while ($line = fscanf($handle, '%d,%s')) {
            $employees[$line[0]][] = explode(',', $line[1]);
          }
          fclose($handle);
          
          print_r($employees);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多