Как сгруппировать многомерный массив по значению подмассива и переназначить ключи в PHP - PullRequest
0 голосов
/ 17 февраля 2012

Я посмотрел на все подобные вопросы и примеры (их много), но все еще не могу заставить это работать (хотя я думаю, что я близок).

У меня есть массив расписаний сотрудников, извлеченных изтекстовый файл ...

schedule.txt:


    123,Joe,20120208,0845,1645
    123,Joe,20120209,0800,1600
    456,Sue,20120208,0900,1700
    456,Sue,20120209,0700,1500
    ...

Мой код для создания массива:


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

Вывод:


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

Вместо этого я пытаюсь сгруппировать сотрудников по 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
                    )
            )
    )

Я не могу за всю свою жизнь обернуться, как изменить существующий массив вэтот новый (другой) вывод ... я пытаюсь это, но ничего не получаю:


    $newArr = array();

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

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

Хотя мой вывод сейчас:


    Array
    (
        [123] => Array
            (
                [0] => Array
                    (
                        [0] => 123
                    )

                [1] => Array
                    (
                        [0] => 123
                    )
            )

        [456] => Array
            (
                [0] => Array
                    (
                        [0] => 456
                    )

                [1] => Array
                    (
                        [0] => 456
                    )
            )
    )

Есть мысли?Я знаю, что в моем коде что-то отсутствует в строке:


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

Я попытался изменить его на:


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

, что дает мой правильный вывод, но теперь я получаю неопределенное смещениеошибки.Кроме того, если количество ключей в подмассиве изменяется, этот код теперь ограничен 4, которые я явно ввел ...

Ответы [ 4 ]

4 голосов
/ 17 февраля 2012

этого должно быть достаточно, если я вас правильно понял:)

$lines = file('./schedule.txt');

$employees = array();
foreach ($lines as $line)
{
    $chunks = explode(',', $line);
    $employees[$chunks[0]][] = array_slice($chunks, 1);
}

print_r($employees);
2 голосов
/ 17 февраля 2012

Существует функция с именем 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 файлы.Может быть, даже определить, что каждый столбец в файле, а также.

1 голос
/ 17 февраля 2012

Вы можете использовать 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);
1 голос
/ 17 февраля 2012
<?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);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...