Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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_Arrayofarrays - Fatal编程技术网

在PHP中,如何基于键清理具有半重复值的数组?

在PHP中,如何基于键清理具有半重复值的数组?,php,arrays,arrayofarrays,Php,Arrays,Arrayofarrays,假设我们在做某种刮取,最终我们可以得到重复和半重复的结果 给定一个可能看起来有点像这样的输入数组: $inputArr = [ [ 'title' => 'Test0', 'desc' => 'Short Desc', ], [ 'title' => 'Test5', 'desc' => 'Short Desc', ], [ 'title' => 'Test0', 'desc' => '

假设我们在做某种刮取,最终我们可以得到重复和半重复的结果

给定一个可能看起来有点像这样的输入数组:

$inputArr = [
  [
    'title' => 'Test0',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test0',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test0.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test1',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test1',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test1.5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test2',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test3.75',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3.25',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test2',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test4',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test4.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test4',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
];
foreach($inputArr as $item) {

    if ( isset($result[$item['title']]) && strlen($result[$item['title']]['desc']) > strlen($item['desc']) )
        continue;    

    $result[$item['title']] = $item;
}

$result = array_values($result);

print_r($result);
生成的数组必须只包含一个实例为
title
value的数组,其中
desc
是最长的字符串值,同时删除除
desc
与其他实例具有相同字符串长度值的数组外的所有数组

e、 g.最终输出应如下所示:

$resultArr = [
  [
    'title' => 'Test0',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test0.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test1',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test1.5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test2',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3.25',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test3.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test3.75',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test4',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test4.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
];
我尝试过几种不同的解决方案,但我一个都不喜欢。不管我怎么做,这感觉就像是一个乱七八糟的问题,我觉得我错过了一个明显而优雅的解决方案


我知道有人会对比我尝试过的排序、循环和过滤更干净的东西提出很好的建议。

您可以这样做:

$inputArr = [
  [
    'title' => 'Test0',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test0',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test0.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test1',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test1',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test1.5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test2',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test3.75',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3.25',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test2',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test3.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test4',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test4.5',
    'desc'  => 'Short Desc',
  ],
  [
    'title' => 'Test4',
    'desc'  => 'Much Longer Than Short Desc',
  ],
  [
    'title' => 'Test5',
    'desc'  => 'Much Longer Than Short Desc',
  ],
];
foreach($inputArr as $item) {

    if ( isset($result[$item['title']]) && strlen($result[$item['title']]['desc']) > strlen($item['desc']) )
        continue;    

    $result[$item['title']] = $item;
}

$result = array_values($result);

print_r($result);

可以使用标题作为键构建新的关联数组。循环原始数组,当键存在时,检查desc的长度是否更长,否则继续,用当前项替换结果数组中的项

您还可以使用
array\u reduce

$result = array_reduce($inputArr, function ($c, $i) {
    if ( !isset($c[$i['title']]) || strlen($c[$i['title']]['desc']) < strlen($i['desc']) )
        $c[$i['title']] = $i;

    return $c;
});


$result = array_values($result);

print_r($result); 
$result=array\u reduce($inputArr,function($c,$i){
如果(!isset($c[$i['title']])| strlen($c[$i['title']]]['desc'])
分享你的解决方案,说出为什么它不起作用。我同意。让我们看看你尝试了什么,为什么不起作用。解决这个问题大约需要5-10分钟,但我们不是来“为您编码”的。如果您使用键为标题的关联数组,而不是二维数组,事情会变得容易得多。@Devon:
array\u values
只是在这里按要求将
$result
从关联数组更改为索引数组。