Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过一个键值合并子数组,并将限定值推入更深的索引子数组?_Php_Arrays_Multidimensional Array_Merge - Fatal编程技术网

Php 如何通过一个键值合并子数组,并将限定值推入更深的索引子数组?

Php 如何通过一个键值合并子数组,并将限定值推入更深的索引子数组?,php,arrays,multidimensional-array,merge,Php,Arrays,Multidimensional Array,Merge,我试图根据散列值合并多维数组的子数组 我的输入如下所示: $images_arr = [ [ 'hash' => '948e980ed2a36d917f1b3026b04e0016', 'filename' => ['73315_73316_73317_LAKE13437_322.tif'], 'filepath' => ['_TEST_DATA'] // and there is more data he

我试图根据
散列值
合并多维数组的子数组

我的输入如下所示:

$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
    ]
];
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
  ),
)
当一个或多个
散列
值匹配时,我希望合并数组,并将
文件名
子数组值和
文件路径
子数组值合并到第一个数组中

大概是这样的:

$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
    ]
];
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
  ),
)
该数组将包含数千条记录,我需要能够在只有
散列值匹配的情况下组合多个数组

到目前为止,我的工作是在数组上使用foreach创建一个变量来缓存散列值,并检查以下循环。然后我可以提取
文件名
文件路径
,在这种情况下。不确定这是否是最熟练的方法-抱歉,我还是一个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
        }

    }
}

通过基于每个数据集的
散列值向结果数组分配临时键,您可以确定是存储第一次出现的散列值,还是需要推送新值

循环完成后,移除临时(外部)键以生成所需的结果

代码:()

输出:

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

可以使用哈希键准备数组。试试下面的

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

感谢您的帮助(为没有发布我的努力表示歉意-这是正确的,但非常有帮助)。将测试:)两个张贴的答案将按需要工作。Divyesh的答案并不费心检查第一次是否出现,因此它在每次迭代时都保存一个函数调用,但是它会用相同的哈希值覆盖现有的哈希值。实际上是一样的。这工作得很好-数组中有许多其他值,这使它们保持不变,而不必另外重置mergeYeah中的每个值!但这很好:)