Тема: Знайти перетин масивів
Мається 8 одномірних масивів з числовими ключами та значеннями. Потрібно знайти масив, котрий буде мати лише ті елементи, котрі є в кожному із 8-ми масивів. Стандартної функції не знайшов) можливо я погано шукав.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → PHP → Знайти перетин масивів
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Мається 8 одномірних масивів з числовими ключами та значеннями. Потрібно знайти масив, котрий буде мати лише ті елементи, котрі є в кожному із 8-ми масивів. Стандартної функції не знайшов) можливо я погано шукав.
Я вже знаю як найти цей масив) але тему вже створив пізно) Пропоную вам знайти рішення у якості задачки по php).
Здається так :
array_intersect($arr1, $arr2, $arr3, ..$arr8)http://www.php.net/manual/uk/function.a … ersect.php
Я б написав це в один рядок, але якщо елементів 100500, то краще використовувати FOR
Свій велосипед:
[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]
Мій велосипед такий:
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;
                    }
                }
            }
        }
    }
}Свій велосипед:
[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
      )
      */Аа, не правильно прочитав перший постав. Думав потрібно по ключам...
По значенням:
 [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]
Ті велосипеди кодери часто вигадуюсь через фофуддю і косоворотку. Нажаль я теж маю такий гріх - в гуглі російською шукати.
що за фофуддя? класно звучить але не знаю що воно означає)))
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;
        }Происходит от жжшного поста с вопросом, заданном в чате лидеру Коммунистической партии Украины П.Симоненку:
Здравствуйте, я из Херсонской области, русский по национальности. Моей дочери в школе запретили носить такой атрибут русской культуры, как фофудья. Аргументировав это тем, что государственный язык — украинский. Хочу спросить, Петр Николаевич: ДОКОЛЕ?
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.сайт-злодій/phophudia
http://сайт-злодій/
Два питання: елементи в масиві можуть повторюватись? І ключі йдуть від 0 до n неперервно?
Одним словом, правильно писати так:
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].

Пітонячий лісп. Замість
lambda x, y: x & yможливо ще краще писати
set.intersection, щоб не було так страшно.
Але щось я зразу назву розділу не помітив. Вибачте.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися