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

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

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

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

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

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

3

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

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

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

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

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

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

4

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

Свій велосипед:
[code=php]
$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;
}
[/code]

5 Востаннє редагувалося Patron (20.08.2012 15: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;
                    }
                }
            }
        }
    }
}

6

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

Replace написав:

Свій велосипед:
[code=php]
$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;
}
[/code]

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

    $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
      )
      */

7

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

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

8

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

По значенням:
[code=php]
     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;
    }[/code]

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

9

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

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

10 Востаннє редагувалося Patron (20.08.2012 16: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;
        }

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

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

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