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中的每个值!但这很好:)