将对合并到组[PHP/数组]

将对合并到组[PHP/数组],php,arrays,grouping,Php,Arrays,Grouping,我在PHP数组中有成对的项。例如: <?php $elements = array( 'tiger'=>'lion', 'car'=>'bike', 'lion'=>'zoo', 'truck'=>'plane' ); ?> 现在,我想合并这些项目,以便所有以任何方式连接的项目都进入一个组。继续上面的例子: <?php $groups = array( 0=>array('tiger', 'lion',

我在PHP数组中有成对的项。例如:

<?php
$elements = array(
    'tiger'=>'lion',
    'car'=>'bike',
    'lion'=>'zoo',
    'truck'=>'plane'
);
?>

现在,我想合并这些项目,以便所有以任何方式连接的项目都进入一个组。继续上面的例子:

<?php
$groups = array(
    0=>array('tiger', 'lion', 'zoo'),
    1=>array('car', 'bike'),
    2=>array('truck', 'plane'
);
?>
想法很简单:

  • 创建一个新数组以容纳您的组
  • 在项数组上循环
  • 检查组数组中是否存在项的组-如果不存在,请创建它
  • 分组
  • 想法很简单:

  • 创建一个新数组以容纳您的组
  • 在项数组上循环
  • 检查组数组中是否存在项的组-如果不存在,请创建它
  • 分组
  • 下面是一个O(n)解决方案:

    $elements = array(
        'tiger' => 'lion',
        'car'   => 'bike',
        'lion'  => 'zoo',
        'truck' => 'plane'
    );
    $groups = array();
    $sub    = array();
    $ignore = array();
    
    foreach ( $elements as $key=>$value ) {
        if ( isset($ignore[$key]) ) {
            continue;
        }
    
        $sub = array($key, $value);
    
        if ( isset($elements[$value]) ) {
            $ignore[$value] = 1;
            $sub[]          = $elements[$value];
        }
    
        $groups[] = $sub;
    }
    
    print_r($groups);
    
    结果:

    Array
    (
        [0] => Array
            (
                [0] => tiger
                [1] => lion
                [2] => zoo
            )
    
        [1] => Array
            (
                [0] => car
                [1] => bike
            )
    
        [2] => Array
            (
                [0] => truck
                [1] => plane
            )
    
    )
    
    下面是一个O(n)解决方案:

    $elements = array(
        'tiger' => 'lion',
        'car'   => 'bike',
        'lion'  => 'zoo',
        'truck' => 'plane'
    );
    $groups = array();
    $sub    = array();
    $ignore = array();
    
    foreach ( $elements as $key=>$value ) {
        if ( isset($ignore[$key]) ) {
            continue;
        }
    
        $sub = array($key, $value);
    
        if ( isset($elements[$value]) ) {
            $ignore[$value] = 1;
            $sub[]          = $elements[$value];
        }
    
        $groups[] = $sub;
    }
    
    print_r($groups);
    
    结果:

    Array
    (
        [0] => Array
            (
                [0] => tiger
                [1] => lion
                [2] => zoo
            )
    
        [1] => Array
            (
                [0] => car
                [1] => bike
            )
    
        [2] => Array
            (
                [0] => truck
                [1] => plane
            )
    
    )
    

    您的子阵列的顺序都是相反的,但我不确定这是否重要。非常感谢,顺序不重要。:)您的子阵列的顺序都是相反的,但我不确定这是否重要。非常感谢,顺序不重要。:)非常感谢,订单无关紧要。:)非常感谢,订单无关紧要。:)