如何在PHP中按子数组值对多维数组进行分组并重新分配键

如何在PHP中按子数组值对多维数组进行分组并重新分配键,php,multidimensional-array,grouping,Php,Multidimensional Array,Grouping,我查看了所有类似的问题和示例(有很多),但仍然无法实现这一点(尽管我认为我很接近) 我有一个从文本文件中提取的员工日程表数组 schedule.txt: 123,Joe,20120208,0845,1645 123,Joe,20120209,0800,1600 456,Sue,20120208,0900,1700 456,Sue,20120209,0700,1500 ... 123,乔,2012020848451645 123,乔,2012020908001600

我查看了所有类似的问题和示例(有很多),但仍然无法实现这一点(尽管我认为我很接近)

我有一个从文本文件中提取的员工日程表数组

schedule.txt:

123,Joe,20120208,0845,1645 123,Joe,20120209,0800,1600 456,Sue,20120208,0900,1700 456,Sue,20120209,0700,1500 ... 123,乔,2012020848451645 123,乔,2012020908001600 456,苏,2012020809001700 456,苏,2012020907001500 ... 我生成数组的代码是:

$schedule = file_get_contents('./schedule.txt'); $s = explode("\n", $schedule); for ($i = 0; $i < count($s); $i++) { $s[$i] = explode(",", $s[$i]); } print_r($s); $schedule=file_get_contents('./schedule.txt'); $s=分解(“\n”,$schedule); 对于($i=0;$i Array ( [0] => Array ( [0] => 123 [1] => Joe [2] => 20120208 [3] => 0845 [4] => 1645 ) [1] => Array ( [0] => 123 [1] => Joe [2] => 20120209 [3] => 0800 [4] => 1600 ) [2] => Array ( [0] => 456 [1] => Sue [2] => 20120208 [3] => 0900 [4] => 1700 ) [3] => Array ( [0] => 456 [1] => Sue [2] => 20120209 [3] => 0700 [4] => 1500 ) ) 排列 ( [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对员工进行分组,输出如下:

Array ( [123] => Array ( [0] => Array ( [0] => Joe [1] => 20120208 [2] => 0845 [3] => 1645 ) [1] => Array ( [0] => Joe [1] => 20120209 [2] => 0800 [3] => 1600 ) ) [456] => Array ( [0] => Array ( [0] => Sue [1] => 20120208 [2] => 0900 [3] => 1700 ) [1] => Array ( [0] => Sue [1] => 20120209 [2] => 0700 [3] => 1500 ) ) ) 排列 ( [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 = array(); foreach($s as $k => $v) { if(!isset($newArr[$v[0]])) { $newArr[$v[0]] = array(); } $newArr[$v[0]][] = array($v[0]); } $newArr=array(); foreach($s为$k=>$v){ 如果(!isset($newArr[$v[0]])){ $newArr[$v[0]]=array(); } $newArr[$v[0]][]=数组($v[0]); } 虽然我现在的输出是:

Array ( [123] => Array ( [0] => Array ( [0] => 123 ) [1] => Array ( [0] => 123 ) ) [456] => Array ( [0] => Array ( [0] => 456 ) [1] => Array ( [0] => 456 ) ) ) 排列 ( [123]=>阵列 ( [0]=>阵列 ( [0] => 123 ) [1] =>阵列 ( [0] => 123 ) ) [456]=>阵列 ( [0]=>阵列 ( [0] => 456 ) [1] =>阵列 ( [0] => 456 ) ) ) 有什么想法吗?我知道我的代码在这行中遗漏了一些东西:

$newArr[$v[0]][] = array($v[0]); $newArr[$v[0]][]=数组($v[0]); 我尝试将其更改为:

$newArr[$v[0]][] = array(0 => $v[1], 1 => $v[2], 2 => $v[3], 3 => $v[4]); $newArr[$v[0]][]=数组(0=>$v[1],1=>$v[2],2=>$v[3],3=>$v[4]);
这给了我正确的输出,但我现在得到了未定义的偏移量错误。另外,如果子数组中的键数发生变化,则此代码现在仅限于我显式输入的4个…

如果我理解正确,这应该足够了:)

您可以使用:

$handle=fopen('./schedule.txt',r');
$employees=array();
而($line=fscanf($handle,'%d,%s')){
$employees[$line[0]][]=分解(',',$line[1]);
}
fclose($handle);
打印(员工);

有一个调用的函数,可以轻松获取逗号分隔的值。没必要自己做

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

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
文件。甚至可以定义文件中每列的内容

<?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);
?>
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
}