Как объединить подмассивы по одному ключевому значению и вставить соответствующие значения в более глубокий индексированный подмассив? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь объединить подмассивы многомерного массива на основе значения hash.

Мой ввод выглядит так:

$images_arr = [
    [
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => ['73315_73316_73317_LAKE13437_322.tif'],
        'filepath' => ['_TEST_DATA']
        // and there is more data here
    ],
    [
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => ['73315_73316_73317_LAKE13437_322(1).tif'],
        'filepath' => ['_TEST_DATA/subdirectory']
        // and there is more data here
    ]
];

При совпадении одного или нескольких значений hash я хочу объединить массивы и объединить значения подмассива filename и значения подмассива filepath в первое.

Примерно так:

array (
  0 => 
  array (
    'hash' => '948e980ed2a36d917f1b3026b04e0016',
    'filename' => 
    array (
      0 => '73315_73316_73317_LAKE13437_322.tif',
      1 => '73315_73316_73317_LAKE13437_322(1).tif',
    ),
    'filepath' => 
    array (
      0 => '_TEST_DATA',
      1 => '_TEST_DATA/subdirectory',
    ),
    // more data here
  ),
)

Массив будет содержать тысячи записей, и мне нужно иметь возможность комбинировать несколько массивов, где совпадают только значения hash.

До сих пор я пытался использовать foreach в массиве, чтобы создать переменную для кэширования значения хэша и проверки следующих циклов. Тогда я могу извлечь filename или filepath, где это так. Не уверен, что этот метод самый искусный - извиняюсь, я все еще новичок в php.

Моя попытка кодирования:

$cache_hash = null;
foreach ($images_arr as $image) {
    $this_hash = $image['hash'];

    if ($cache_hash != $this_hash) {
        $cache_hash = $this_hash;
    } else {

        foreach ($image['filename'] as $filename) {
            //Get filename
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете подготовить массив с помощью хеш-ключа. Попробуйте следующее.

<?php
// Input array set
$input = array(
    array(
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => array('73315_73316_73317_LAKE13437_322.tif'),
        'filepath' => array('_TEST_DATA')
    ),
    array(
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => array('73315_73316_73317_LAKE13437_322(1).tif'),
        'filepath' => array('_TEST_DATA/subdirectory')
    ),
    array(
        'hash' => '948e980ed2a36d917f1b3026b04e0018',
        'filename' => array('73315_73316_73317_LAKE13437_321.tif'),
        'filepath' => array('_TEST_DATA/subdirectory')
    ),
    array(
        'hash' => '948e980ed2a36d917f1b3026b04e0018',
        'filename' => array('73315_73316_73317_LAKE13437_321(1).tif'),
        'filepath' => array('_TEST_DATA/subdirectory')
    ),
);

$mergeArrayWithHash = [];
foreach ($input as $value) {
    $mergeArrayWithHash[$value['hash']]['hash'] = $value['hash'];
    $mergeArrayWithHash[$value['hash']]['filename'][] = $value['filename'][0];
    $mergeArrayWithHash[$value['hash']]['filepath'][] = $value['filepath'][0];
}
// Your Output array
$result = array_values($mergeArrayWithHash);

echo "<pre>";
print_r($result);
exit;
0 голосов
/ 05 сентября 2018

Назначая временные ключи вашему массиву результатов на основе значения hash каждого набора данных, вы можете определить, сохраняете ли вы первое вхождение хэша, или вам нужно выдвинуть новые значения.

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

Код: ( Демо )

$array = [
    [
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => ['73315_73316_73317_LAKE13437_322.tif'],
        'filepath' => ['_TEST_DATA']
    ],
    [
        'hash' => '948e980ed2a36d917f1b3026b04e0016',
        'filename' => ['73315_73316_73317_LAKE13437_322(1).tif'],
        'filepath' => ['_TEST_DATA/subdirectory']
    ]
];

foreach ($array as $set) {
    if (!isset($result[$set['hash']])) {          // check if 1st occurrence of hash value
        $result[$set['hash']] = $set;             // save whole set
    } else {                                      // not 1st occurrence
        $result[$set['hash']]['filename'][] = $set['filename'][0];  // push filename value into this hash's group
        $result[$set['hash']]['filepath'][] = $set['filepath'][0];  // push filepath value into this hash's group
    }
}

var_export(array_values($result));  // re-index the result array to remove temp keys

Выход:

array (
  0 => 
  array (
    'hash' => '948e980ed2a36d917f1b3026b04e0016',
    'filename' => 
    array (
      0 => '73315_73316_73317_LAKE13437_322.tif',
      1 => '73315_73316_73317_LAKE13437_322(1).tif',
    ),
    'filepath' => 
    array (
      0 => '_TEST_DATA',
      1 => '_TEST_DATA/subdirectory',
    ),
  ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...