Объединить повторяющиеся записи в массиве / foreach - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь объединить две записи либо на уровне массива, либо на уровне foreach (либо будет нормально работать)

Вот код:

<code>foreach ($objects['Contents'] as $object) {

    $_object_ = str_replace($prefix, '', $object['Key']);
    $_date_ = str_replace('+00:00', '', str_replace('T', ' ', $object['LastModified']));

    $folders = array();

    if (strpos($_object_, '/') !== false && substr($_object_, -1) != '/') {

        if (!in_array(strtok($_object_, '/'), $folders)) {
            array_push($folders, strtok($_object_, '/'));
        }

    } elseif (strpos($_object_, '/') !== false) {
        array_push($folders, str_replace('/', '', $_object_));
    }

    echo '<pre>';

    foreach($folders as $folder){
      echo $folder.'<br/>';
      if (strpos($_object_ , $folder.'/') !== false) {
        echo ' -'.str_replace($folder.'/', '', $_object_);
      }
    }

    echo '
'; }

Вот вывод:

folder
 -
general
 -BMS-Shield.txt
general
 -image-2.jpg
planning
 -composer.json
test
 -

Вот желаемый вывод:

folder

general
 -BMS-Shield.txt
 -image-2.jpg
planning
 -composer.json
test

Просто немного фона, который я пытаюсь получить список файлов из aws s3 и отображение содержимого каждой папки («папка», «общая информация», «планирование» и т. д. c ...), но если в папке более одного файла, он печатает папка дважды (как видно из вывода выше).

Вот структура файла на s3:

image of file structure

Я пробовал array_unique() функция, но это дало тот же вывод.

Любая помощь будет высоко ценится.

Вывод $ objects ['Contents']:

Array
(
    [0] => Array
        (
            [Key] => dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/folder/
            [LastModified] => Aws\Api\DateTimeResult Object
                (
                    [date] => 2020-02-25 09:47:43.000000
                    [timezone_type] => 2
                    [timezone] => Z
                )

            [ETag] => "d41d8cd98f00b204e9800998ecf8427e"
            [Size] => 0
            [StorageClass] => STANDARD
        )

    [1] => Array
        (
            [Key] => dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/general/BMS-Shield.txt
            [LastModified] => Aws\Api\DateTimeResult Object
                (
                    [date] => 2020-02-25 10:24:58.000000
                    [timezone_type] => 2
                    [timezone] => Z
                )

            [ETag] => "5270e0e4f58c9b33eb7fc6f4cb3c8a04"
            [Size] => 2747
            [StorageClass] => STANDARD
        )

    [2] => Array
        (
            [Key] => dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/general/image-2.jpg
            [LastModified] => Aws\Api\DateTimeResult Object
                (
                    [date] => 2020-02-24 16:34:21.000000
                    [timezone_type] => 2
                    [timezone] => Z
                )

            [ETag] => "1c6eaa239899913d732a4bca343a1eac"
            [Size] => 57667
            [StorageClass] => STANDARD
        )

    [3] => Array
        (
            [Key] => dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/planning/composer.json
            [LastModified] => Aws\Api\DateTimeResult Object
                (
                    [date] => 2020-02-24 16:34:45.000000
                    [timezone_type] => 2
                    [timezone] => Z
                )

            [ETag] => "b83a5f582075d5668c8bb092b2e20516"
            [Size] => 62
            [StorageClass] => STANDARD
        )

    [4] => Array
        (
            [Key] => dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/test/
            [LastModified] => Aws\Api\DateTimeResult Object
                (
                    [date] => 2020-02-25 09:08:36.000000
                    [timezone_type] => 2
                    [timezone] => Z
                )

            [ETag] => "d41d8cd98f00b204e9800998ecf8427e"
            [Size] => 0
            [StorageClass] => STANDARD
        )

)

Вывод Папки $:

Array
(
    [0] => test
)

1 Ответ

1 голос
/ 25 февраля 2020

Вы можете сделать это, указав свой массив $folders в качестве имени папки, а в качестве значения - массив подпапок:

<code>$objects = [
    [
        'Key' => 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/folder/',
        'LastModified' => [
            'date' => '2020-02-25 09:47:43.000000',
            'timezone_type' => '2',
            'timezone' => 'Z'
        ],
        'ETag' => 'd41d8cd98f00b204e9800998ecf8427e',
        'Size' => 0,
        'StorageClass' => 'STANDARD'
    ],
    [
        'Key' => 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/general/BMS-Shield.txt',
        'LastModified' => [
            'date' => '2020-02-25 10:24:58.000000',
            'timezone_type' => '2',
            'timezone' => 'Z'
        ],
        'ETag' => '5270e0e4f58c9b33eb7fc6f4cb3c8a04',
        'Size' => 0,
        'StorageClass' => 'STANDARD'
    ],
    [
        'Key' => 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/general/image-2.jpg',
        'LastModified' => [
            'date' => '2020-02-24 16:34:21.000000',
            'timezone_type' => '2',
            'timezone' => 'Z'
        ],
        'ETag' => '1c6eaa239899913d732a4bca343a1eac',
        'Size' => 0,
        'StorageClass' => 'STANDARD'
    ],
    [
        'Key' => 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/planning/composer.json',
        'LastModified' => [
            'date' => '2020-02-24 16:34:45.000000',
            'timezone_type' => '2',
            'timezone' => 'Z'
        ],
        'ETag' => 'b83a5f582075d5668c8bb092b2e20516',
        'Size' => 62,
        'StorageClass' => 'STANDARD'
    ] ,
    [
        'Key' => 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/test/',
        'LastModified' => [
            'date' => '2020-02-25 09:08:36.000000',
            'timezone_type' => '2',
            'timezone' => 'Z'
        ],
        'ETag' => 'd41d8cd98f00b204e9800998ecf8427e',
        'Size' => 0,
        'StorageClass' => 'STANDARD'
    ] 
];

$prefix = 'dashboard/demo.consultive.test/user-data/nXb2K1feviqsjzuW7mgQG2Cghc1Kem8U/uploads/';

$folders = [];

foreach ($objects as $object) {

    $sub_folders = array();

    $_object_ = str_replace($prefix, '', $object['Key']);
    $_date_ = str_replace('+00:00', '', str_replace('T', ' ', $object['LastModified']));

    if (strpos($_object_, '/') !== false && substr($_object_, -1) != '/') {

        if (!in_array(strtok($_object_, '/'), $folders)) {
            $folders[strtok($_object_, '/')][] = explode('/', $_object_)[1];
        }

    } elseif (strpos($_object_, '/') !== false) {
        $folders[str_replace('/', '', $_object_)] = '';
    }
} 

echo '<pre>';

    foreach($folders as $key => $folder){
      echo $key.'<br/>';
      if (is_array($folder)) {
          foreach($folder as $f) {
            echo ' -'.$f;
            echo '<br/>';
          }
      } else {
        echo '<br/>';
      }
    }

echo '
';

Отказ от ответственности: код работает и дает вам идею для лучшей логики c. Это не оптимизировано и не является лучшим решением. Но это решение.

https://wtools.io/php-sandbox/b0dL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...