English 中文(简体)
Combine pairs to groups [PHP / Arrays]
原标题:

I have pairs of items in an PHP array. Example:

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

Now I want to combine these items so that all items which are connected in any way go to one group. Continuation of the example above:

<?php
$groups = array(
    0=>array( tiger ,  lion ,  zoo ),
    1=>array( car ,  bike ),
    2=>array( truck ,  plane 
);
?>

Is this understandable? How could I achieve this?

I m looking for a function which does this.

最佳回答
<?php

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

$groups = array();

foreach ($elements as $key => $val) {
    $appended = false;
    foreach ($groups as &$group) {
        if ($group[0] == $key) {
            array_unshift($group, $val);
            $appended = true;
            break;
        }
    }
    if (!$appended) {
        $groups[] = array($val, $key);
    }
}

var_dump($groups);

Gives:

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "zoo"
    [1]=>
    string(4) "lion"
    [2]=>
    string(5) "tiger"
  }
  [1]=>
  &array(2) {
    [0]=>
    string(4) "bike"
    [1]=>
    string(3) "car"
  }
  [2]=>
  array(2) {
    [0]=>
    string(5) "plane"
    [1]=>
    string(5) "truck"
  }
}
问题回答

Here s an O(n) solution:

$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);

Result:

Array
(
    [0] => Array
        (
            [0] => tiger
            [1] => lion
            [2] => zoo
        )

    [1] => Array
        (
            [0] => car
            [1] => bike
        )

    [2] => Array
        (
            [0] => truck
            [1] => plane
        )

)

The idea is simple:

  1. Create a new array to hold your groups
  2. Loop over the item array
  3. Check if the group for the item exists in the group array - if it does not, create it
  4. Put item in group




相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签