Тема: Знайти перетин масивів
Мається 8 одномірних масивів з числовими ключами та значеннями. Потрібно знайти масив, котрий буде мати лише ті елементи, котрі є в кожному із 8-ми масивів. Стандартної функції не знайшов) можливо я погано шукав.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → PHP → Знайти перетин масивів
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Мається 8 одномірних масивів з числовими ключами та значеннями. Потрібно знайти масив, котрий буде мати лише ті елементи, котрі є в кожному із 8-ми масивів. Стандартної функції не знайшов) можливо я погано шукав.
Я вже знаю як найти цей масив) але тему вже створив пізно) Пропоную вам знайти рішення у якості задачки по php).
Здається так :
array_intersect($arr1, $arr2, $arr3, ..$arr8)
http://www.php.net/manual/en/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
Для відправлення відповіді ви повинні увійти або зареєструватися