【问题标题】:Find similar subarrays in some arrays在某些数组中查找相似的子数组
【发布时间】:2013-11-15 16:25:35
【问题描述】:

有一些数组:

$a = array(
   0 => array('value' => 1000, 'name' => 'AA1'),
   1 => array('value' => 2000, 'name' => 'AA2'),
   2 => array('value' => 3000, 'name' => 'AA3'),
   3 => array('value' => 4000, 'name' => 'AA4'),
);
$b = array(
   0 => array('value' => 1000, 'name' => 'BB1'),
   1 => array('value' => 3000, 'name' => 'BB2'),
   2 => array('value' => 1700, 'name' => 'BB3'),
   3 => array('value' => 1200, 'name' => 'BB4'),
);
$c = array(
   0 => array('value' => 3000, 'name' => 'CC1'),
   1 => array('value' => 4000, 'name' => 'CC2'),
   2 => array('value' => 4300, 'name' => 'CC3'),
   3 => array('value' => 5000, 'name' => 'CC4'),
);

如何从数组 $a、$b 和 $c 创建具有相同变体的新数组?并按“值”字段排序..

$d = array(
   0 => array('value' => 3000, 'name' => 'AA3');
);

真实例子:http://3v4l.org/MAWjd

【问题讨论】:

  • 我不明白你的输出标准是什么。你能解释得更好吗?
  • 需要找到所有具有相似“值”的子数组
  • 如果该数组应该具有相同值的所有元素,您如何对它们进行“排序”?
  • 不知道这就是我要问的原因:) 只需要得到'd'-variant
  • 为什么数组d 有一个字段name 的值为AA1?标准是什么?

标签: php arrays algorithm


【解决方案1】:
//  Test Data
$timeVariantSerialized = 'a:3:{s:7:"group_a";a:3:{i:0;a:3:{s:10:"id_variant";i:122;s:4:"name";s:13:"3 hour 30 min";s:4:"time";i:12600;}i:1;a:3:{s:10:"id_variant";i:173;s:4:"name";s:6:"3 hour";s:4:"time";i:10800;}i:2;a:3:{s:10:"id_variant";i:271;s:4:"name";s:6:"1 hour";s:4:"time";i:3600;}}s:7:"group_b";a:2:{i:0;a:3:{s:10:"id_variant";i:107;s:4:"name";s:13:"1 hour 30 min";s:4:"time";i:5400;}i:1;a:3:{s:10:"id_variant";i:321;s:4:"name";s:6:"3 hour";s:4:"time";i:10800;}}s:7:"group_c";a:4:{i:0;a:3:{s:10:"id_variant";i:28;s:4:"name";s:6:"1 hour";s:4:"time";i:3600;}i:1;a:3:{s:10:"id_variant";i:98;s:4:"name";s:6:"3 hour";s:4:"time";i:10800;}i:2;a:3:{s:10:"id_variant";i:157;s:4:"name";s:6:"2 hour";s:4:"time";i:7200;}i:3;a:3:{s:10:"id_variant";i:158;s:4:"name";s:13:"1 hour 30 min";s:4:"time";i:5400;}}}';

//  Test Data Array
$time_variant = unserialize( $timeVariantSerialized ); 

$groupsCount = count( $time_variant );

foreach( $time_variant as $groupId => $groupArray )
{
    foreach( $groupArray as $groupChildId => $groupChildArray )
    {
        $timeCountsArray[$groupChildArray['time']][$groupId] = $groupChildId;
    }
}

$result = array();

foreach( $timeCountsArray as $time => $groupIdsArray )
{
    if( $groupsCount > count( $groupIdsArray ) ) continue;

    foreach( $groupIdsArray as $groupId => $groupChildId )
    {
        $result[$time_variant[$groupId][$groupChildId]['id_variant']]
            = $time_variant[$groupId][$groupChildId];
    //  If you need only one result , uncomment the below break
    //  break;
    }
    //  If more than 1 time could have variants , comment out below break to get them all
    break;
}

ksort( $result );

print_r( $result );

结果数组:

array
(
    '98' => array
        (
            'id_variant' => 98
            'name' => 3 hour
            'time' => 10800
        )

    '173' => array
        (
            'id_variant' => 173
            'name' => 3 hour
            'time' => 10800
        )

    '321' => array
        (
            'id_variant' => 321
            'name' => 3 hour
            'time' => 10800
        )

)

【讨论】:

    【解决方案2】:

    我不确定这是否是你想要的。

    结果是一个包含给定数组中所有重复值的单个数组:

    //Lets merge them into a big array to work in a easier way;
    //It will be a single level array as follow: [a0] => 1000, [a1] => 2000 etc.
    $array = array('a' => $a, 'b' => $b, 'c' =>$c);
    foreach($array as $letter => $subArray){
        foreach($subArray as $key => $values){
            $newArray[$letter.$key] = $values['value'];
        }
    }
    
    $uniques = array_unique($newArray); //getting the non-repeated values
    $repeated = array_diff_assoc($newArray, $uniques); // stripping them out
    $final = array_unique($repeated); //cleaning the repeated values to just 1 of each
    
    print_r($final);
    

    结果

    Array
    (
        [b0] => 1000
        [b1] => 3000
        [c1] => 4000
    )
    

    【讨论】:

    • 这不是正确的答案,因为我在数组$c中没有值'1000',而数组$b中不存在值'4000'。
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多