1 Востаннє редагувалося Patron (20.08.2012 09:49:03)

Тема: Знайти перетин масивів

Мається 8 одномірних масивів з числовими ключами та значеннями. Потрібно знайти масив, котрий буде мати лише ті елементи, котрі є в кожному із 8-ми масивів. Стандартної функції не знайшов) можливо я погано шукав.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

2 Востаннє редагувалося Patron (20.08.2012 10:56:18)

Re: Знайти перетин масивів

Я вже знаю як найти цей масив) але тему вже створив пізно) Пропоную вам знайти рішення у якості задачки по php).

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

3

Re: Знайти перетин масивів

Здається так :

array_intersect($arr1, $arr2, $arr3, ..$arr8)

http://www.php.net/manual/en/function.a … ersect.php

Я б написав це в один рядок, але якщо елементів 100500, то краще використовувати FOR

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться
Подякували: Patron1

4

Re: Знайти перетин масивів

Свій велосипед:

$arrays = array(
    array(1 => 1, 2 => 3, 3 => 4, 5 => 5),
    array(1 => 4, 2 => 2, 4 => 3, 5 => 5),
);

print_r(intersect($arrays));


function intersect($arrays) {    
    
    // якщо масив масивів пустий
    if (sizeof($arrays) == 0) {
        return array();
    }
        
    $common = $arrays[0];
    for ($i = 1; $i < sizeof($arrays); $i++) {
        foreach($arrays[$i] as $key => $value) {
            if (array_key_exists($key, $arrays[$i]) === FALSE) {
                unset($arrays[$i][$key]);
            }
        }
        foreach($arrays[$i] as $key => $value) {
            if (array_key_exists($key, $arrays[$i]) === FALSE) {
                unset($common[$key]);
            }
        }
    }
    
    return $common;
}

5 Востаннє редагувалося Patron (20.08.2012 16:06:54)

Re: Знайти перетин масивів

Мій велосипед такий:

function intersect($arrays) {
    $intersection = array();
    if(count($arrays) > 0) {
        $max = count($arrays);
        for($i = 0; $i < count($arrays); $i++){
            for($k = 0; $k < count($arrays[$i]); $k++){
                $value = $arrays[$i][$k];
                $exists = true;
                $j = 0;
                while($j < $max){
                    if(in_array($value, $arrays[$j])){
                        $j++;
                        continue;
                    } else {
                        $exists = false;
                        break;
                    }
                }
                if($exists) {
                    if(!in_array($value, $intersection)) {
                        $intersection[] = $value;
                    }
                }
            }
        }
    }
}
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

6

Re: Знайти перетин масивів

Replace написав:

Свій велосипед:

$arrays = array(
    array(1 => 1, 2 => 3, 3 => 4, 5 => 5),
    array(1 => 4, 2 => 2, 4 => 3, 5 => 5),
);

print_r(intersect($arrays));


function intersect($arrays) {    
    
    // якщо масив масивів пустий
    if (sizeof($arrays) == 0) {
        return array();
    }
        
    $common = $arrays[0];
    for ($i = 1; $i < sizeof($arrays); $i++) {
        foreach($arrays[$i] as $key => $value) {
            if (array_key_exists($key, $arrays[$i]) === FALSE) {
                unset($arrays[$i][$key]);
            }
        }
        foreach($arrays[$i] as $key => $value) {
            if (array_key_exists($key, $arrays[$i]) === FALSE) {
                unset($common[$key]);
            }
        }
    }
    
    return $common;
}

Дядьку, твоя функція не працює, щось ти не те намудрував з кеями))
Ось перевір так її :

    $arrays= array();
    $arrays[] = array(1,2,3,4,88,53);
    $arrays[] = array(88,2,3,4,22,53);
    $arrays[] = array(1,88,3,4,42,53);
    $arrays[] = array(1,2,88,4,34,53);
    $arrays[] = array(1,2,3,88,56,53);
    $arrays[] = array(1,2,3,4,88,53);
       /*
       тут перетином буде 
       Array
      (
          [0] => 88
          [1] => 53
      )
      */
      function intersect($arrays) {    
        // якщо масив масивів пустий
        if (sizeof($arrays) == 0) {
            return array();
        }
            
        $common = $arrays[0];
        for ($i = 1; $i < sizeof($arrays); $i++) {
            foreach($arrays[$i] as $key => $value) {
                if (array_key_exists($key, $arrays[$i]) === FALSE) {
                    unset($arrays[$i][$key]);
                }
            }
            foreach($arrays[$i] as $key => $value) {
                if (array_key_exists($key, $arrays[$i]) === FALSE) {
                    unset($common[$key]);
                }
            }
        }
    
        return $common;
    }
       /*
       твій велосипед видає
      Array
      (
          [0] => 1
          [1] => 2
          [2] => 3
          [3] => 4
          [4] => 88
          [5] => 53
      )
      */
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

7

Re: Знайти перетин масивів

Аа, не правильно прочитав перший постав. Думав потрібно по ключам...

8

Re: Знайти перетин масивів

По значенням:

 
     function intersect($arrays) {    
        // якщо масив масивів пустий
        if (sizeof($arrays) == 0) {
            return array();
        }
            
        $common = $arrays[0];
        for ($i = 1; $i < sizeof($arrays); $i++) {
            foreach ($common as $key => $value) {
                if (!in_array($value, $arrays[$i])) {
                    unset($common[$key]);
                }
            }
        }
    
        return $common;
    }
Подякували: Patron1

9

Re: Знайти перетин масивів

Ті велосипеди кодери часто вигадуюсь через фофуддю і косоворотку. Нажаль я теж маю такий гріх - в гуглі російською шукати.

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться

10 Востаннє редагувалося Patron (20.08.2012 17:33:35)

Re: Знайти перетин масивів

що за фофуддя? класно звучить але не знаю що воно означає)))
array_intersect($arr1, $arr2, $arr3, ..$arr8) - трохи незручно, по тій причині що кількість вхідних масивів може бути різною. Так що приходиться вигадувати свої велосипеди. Короче я оптимізував свій ровер і в результаті вийшло таке:

function intersect($arrays) {
            $intersection = array();
            if(count($arrays) > 0) {
                // find intersection
                $max = count($arrays);
                foreach($arrays[0] as $value){
                    $exists = true;
                    $j = 0;
                    while($j < $max){
                        if(in_array($value, $arrays[$j])){
                            $j++;
                            continue;
                        } else {
                            $exists = false;
                            break;
                        }
                    }
                    if($exists) {
                        if(!in_array($value, $intersection)) {
                            $intersection[] = $value;
                        }
                    }
                }
            }
            return $intersection;
        }
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

11

Re: Знайти перетин масивів

Происходит от жжшного поста с вопросом, заданном в чате лидеру Коммунистической партии Украины П.Симоненку:

Здравствуйте, я из Херсонской области, русский по национальности. Моей дочери в школе запретили носить такой атрибут русской культуры, как фофудья. Аргументировав это тем, что государственный язык — украинский. Хочу спросить, Петр Николаевич: ДОКОЛЕ?

http://dramatica.org.ua/%D0%A4%D0%BE%D1 … 1%8C%D1%8F
http://lurkmore.to/%D0%A4%D0%BE%D1%84%D … 1%8C%D1%8F
http://community.livejournal.com/phophudia
http://pdrs.dp.ua/

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться

12

Re: Знайти перетин масивів

Два питання: елементи в масиві можуть повторюватись? І ключі йдуть від 0 до n неперервно?

13

Re: Знайти перетин масивів

Одним словом, правильно писати так:

def intersect(*args):
    return list(reduce(lambda x, y: x & y, map(set, args)))

print intersect(
  (1,2,3,4,88,53),
  (88,2,3,4,22,53),
  (1,88,3,4,42,53),
  (1,2,88,4,34,53),
  (1,2,3,88,56,53),
  (1,2,3,4,88,53),
)

,
що виведе [88, 53].

:D

Подякували: d4rkc10ud1

14

Re: Знайти перетин масивів

2bunyk
Що це за лісп?
http://lisperati.com/lisplogo_256.png

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться

15

Re: Знайти перетин масивів

Пітонячий лісп. Замість

lambda x, y: x & y

можливо ще краще писати

set.intersection

, щоб не було так страшно.

Але щось я зразу назву розділу не помітив. Вибачте.