【问题标题】:Compare multiple array values and return keys of duplicates比较多个数组值并返回重复项的键
【发布时间】:2017-12-29 09:35:48
【问题描述】:

解决方案

$hours = array(
    'Mo' => array('open' => true, 'from' => '10:00', 'to' => '20:00'),
    'Tu' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
    'We' => array('open' => true, 'from' => '10:00', 'to' => '20:00'),
    'Th' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
    'Fr' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
    'Sa' => array('open' => true, 'from' => '11:00', 'to' => '16:00'),
    'Su' => array('false' => true, 'from' => '11:00', 'to' => '16:00')
);

$res = [];
foreach($hours as $k=>$v) {
    if($v['open']){
        $t = $v['from'] . ' - ' . $v['to'];
        if (! isset($res[$t]))  $ret[$t] = [];
        $res[$t][] = $k;
    }
}
$final = [];
foreach($res as $k=>$v) {
  $final[] = implode(', ', $v) . ' ' . $k;
}
echo implode(' ', $final);

已编辑以包含 cmets

试图找到一种解决方案来比较多维数组中的多个值并分组返回匹配的数组键。

示例数组:

$hours = array(
'Mo' => array('open' => true, 'from' => '10:00', 'to' => '20:00'),
'Tu' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
'We' => array('open' => true, 'from' => '10:00', 'to' => '20:00'),
'Th' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
'Fr' => array('open' => true, 'from' => '10:00', 'to' => '18:00'),
'Sa' => array('open' => true, 'from' => '11:00', 'to' => '18:00'),
'Su' => array('open' => true, 'from' => '11:00', 'to' => '18:00')
);

因此,上面的示例将导致 Mo & We 被组合在一起,Tu、Th、Fr 被组合在一起,以及 Sa 和 Su > 组合在一起。 我的意图是使用结果来压缩 ld+jason 模式的时间。所需的最终结果将是一个如下所示的字符串:Mo, We 10:00 - 20:00 Tu, Th, Fr 10:00 - 18:00 Sa, Su 11:00 - 16:00 实现此目的的最佳方式?

我查看了数组相交,但这似乎不是我想要的。 (或者至少我不知道如何从我共享的多维数组中获取我需要使用它的结果。这是比较两个数组而不是多维数组的多个级别。

【问题讨论】:

  • 您可以将字段'group'添加到数组中的每个项目
  • 你将如何使用结果数组? - 设置数组结构?
  • 我的目的是使用结果来压缩 ld+jason 模式的时间。所需的最终结果将是一个如下所示的字符串:Mo, We 10:00 - 08:00 Tu, Th, Fr 10:00 - 06:00 Sa, Su 11:00 - 04:00

标签: php arrays


【解决方案1】:

翻转数组并用相同的时间表收集天数

$res = [];
foreach($hours as $k=>$v) {
  $t = $v['from'] . ' - ' . $v['to'];
  if (! isset($res[$t]))  $ret[$t] = [];
  $res[$t][] = $k;
}

foreach($res as $k=>$v) {
  echo implode(', ', $v) . ' ' . $k ."\n";
}

demo

【讨论】:

  • 哦,这看起来像个赢家。
【解决方案2】:

不知道有没有更好的解决方案,但是这样可以给你一个不错的结果。

$hours = array(
    'Mo' => array('open' => true, 'from' => '10:00', 'to' => '08:00'),
    'Tu' => array('open' => true, 'from' => '10:00', 'to' => '06:00'),
    'We' => array('open' => true, 'from' => '10:00', 'to' => '08:00'),
    'Th' => array('open' => true, 'from' => '10:00', 'to' => '06:00'),
    'Fr' => array('open' => true, 'from' => '10:00', 'to' => '06:00'),
    'Sa' => array('open' => true, 'from' => '11:00', 'to' => '04:00'),
    'Su' => array('open' => true, 'from' => '11:00', 'to' => '04:00')
);

$newHours = [];
foreach ($hours as $day => $hour){
    $index = array_search($hour, $newHours);
    if ( $index == false ){
        $newHours[$day] = $hour;
    }else{
        unset($newHours[$index]);
        $newHours[$index . ',' . $day] = $hour; 
    }
}

print_r($newHours);

结果将是:

Array
(
    [Mo,We] => Array
        (
            [open] => 1
            [from] => 10:00
            [to] => 08:00
        )

    [Tu,Th,Fr] => Array
        (
            [open] => 1
            [from] => 10:00
            [to] => 06:00
        )

    [Sa,Su] => Array
        (
            [open] => 1
            [from] => 11:00
            [to] => 04:00
        )

)

【讨论】:

  • 我认为这足以让我到达我想去的地方。现在测试,我会报告!谢谢!
【解决方案3】:

你应该使用 array_intersect 函数。

    <?php 
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow")‌​; 
$a2=array("e"=>"red","f"=>"green","g"=>"blue"); 
$result=array_intersect($a1,$a2); print_r($result); 
?> 

输出

Array ( [a] => red [b] => green [c] => blue ) 

【讨论】:

  • 您为什么不使用您发布的 cmets 编辑您的答案。这比添加新的 cmets 要好得多。
  • 我查看了数组相交,但这似乎不是我想要的。 (或者至少我不知道如何从我共享的多维数组中获取我需要使用它的结果。这是比较两个数组而不是多维数组的多个级别。
  • 做一个自定义比较,你需要使用array_uintersect() php.net/array_uintersect,它使用了一个用户定义的比较函数
猜你喜欢
  • 2014-12-08
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2015-07-19
相关资源
最近更新 更多