Сравнить и вывести массив

KotOFF

Новичок
есть 4 массива: $films - Фильмы, $actors - Актеры, filmsActors - Фильмы в которых играет роль тот или иной актер и массив $test - это актеры, где мы запрашуем найти фильм(фильмы) с участием этих актеров!
как через цикл foreach сравнить актеров($test) и массив ($filmsActors) вывести соответсвенную информацию? тоесть
PHP:
//Фильмы:
$films = array(
1=>array('id'=>1, 'title'=>'Том и Джери', 'year'=>2004),
2=>array('id'=>2, 'title'=>'Кот в сапогах', 'year'=>2013),
3=>array('id'=>3, 'title'=>'Доктор Айболит', 'year'=>2012),
4=>array('id'=>4, 'title'=>'Мачо и Ботан', 'year'=>2013),
5=>array('id'=>5, 'title'=>'Универ', 'year'=>2008),
);
//Aктеры:
$actors = array(
1=>array('id'=>1, 'name'=>'Петя'),
2=>array('id'=>2, 'name'=>'Лена'),
3=>array('id'=>3, 'name'=>'Света'),
4=>array('id'=>4, 'name'=>'Коля'),
5=>array('id'=>5, 'name'=>'Вася'),
6=>array('id'=>6, 'name'=>'Маша')
);
//Фильмы в которых актеры играют свою роль:
$filmsActors = array(
1=>array('id'=>1, 'film'=>'Том и Джери', 'actor'=>'Вася'),
2=>array('id'=>2, 'film'=>'Том и Джери', 'actor'=>'Маша'),
3=>array('id'=>3, 'film'=>'Универ', 'actor'=>'Петя'),
4=>array('id'=>4, 'film'=>'Универ', 'actor'=>'Вася'),
5=>array('id'=>5, 'film'=>'Универ', 'actor'=>'Маша'),
6=>array('id'=>6, 'film'=>'Мачо и ботан', 'actor'=>'Коля'),
7=>array('id'=>7, 'film'=>'Мачо и ботан', 'actor'=>'Вася'),
8=>array('id'=>8, 'film'=>'Доктор Айболит', 'actor'=>'Света'),
9=>array('id'=>9, 'film'=>'Доктор Айболит', 'actor'=>'Петя'),
10=>array('id'=>10, 'film'=>'Доктор Айболит', 'actor'=>'Лена'),
11=>array('id'=>11, 'film'=>'Доктор Айболит', 'actor'=>'Коля'),
12=>array('id'=>12, 'film'=>'Кот в сапогах', 'actor'=>'Вася'),
13=>array('id'=>13, 'film'=>'Кот в сапогах', 'actor'=>'Петя'),
);
//Запрашуемые актеры:
$users = array(
1=>array('id'=>1, 'name'=>'Вася'),
2=>array('id'=>2, 'name'=>'Петя'),
);
Вывод информации (Так как Вася и Петя играли вместе свои роли только в двох фильмах то результат):
id='2' title='Кот в сапогах' year='2013'
id='5' title='Универ' year='2008'
Помогите решить эту задачу пожалуйста!
 

KotOFF

Новичок
Вам за вас написать калбэк к array_walk или что?
решение у меня есть, но мне бы хотелось как бы упростить код, может что-то подскажите?

PHP:
//Находим все фильмы с данными актерами
$result = array();
for ($i = 1; $i < count($filmsActors)+1; $i++)
for ($j = 1; $j < count($users)+1; $j++)
if ($users[$j]["name"] == $filmsActors[$i]["actor"])
if (isset($result[$filmsActors[$i]["film"]]))
$result[$filmsActors[$i]["film"]]++;
else
$result[$filmsActors[$i]["film"]] = 1;

//Выбираем только те, в которых есть все перечисленные актеры
foreach ($result as $k => $v)
if ($v == count($users))
foreach ($films as $v1)
if ($v1["title"] == $k)
echo "ID - ".$v1["id"].", Title - ".$v1["title"].", Year - ".$v1["year"]."</br>\r\n";
 

AnrDaemon

Продвинутый новичок
Скажите честно, вы ведь даже не открывали ссылку, которую я вам дал?
 

С.

Продвинутый новичок
Да на фиг нужна твоя ссылка. Толку от нее?
 

С.

Продвинутый новичок
Дюжина строк кода, куда уж проще. Отступы только расставь.
 

Arramis

Новичок
решение у меня есть, но мне бы хотелось как бы упростить код, может что-то подскажите?
да ты издеваешься, я чо тут зря старался ??
вобщем вот вариант, но он побольше твоего будет ...
функция возвращает массив единственный элемент которого содержит фильмы или фильм в котором снимались актёры...
PHP:
function get_film_or_films($filmsActors, $searchActors) {
    $j = 0;
    $res = array( 'films' => array() );
    $filmsWhereActors = array( 'films' => array() );

    foreach ($filmsActors as $filmActor) {
        foreach ($filmActor as $key => $filmActorValue) {
            if ($key != 'actor') continue;
       
            foreach ($searchActors as $searchActor)    {
                foreach ($searchActor as $key => $searchActorValue)    {
                    if ($key != 'name' || $searchActorValue != $filmActorValue) continue;               
                    $res['films'][$j++] = $filmActor['film'];
                }                       
            }
        }
    }

    $c = count($res['films']); $k = 0;

    for ($i = $c - 1; $i >= 0; --$i) {
        for ($j = $i; $j >= 0; --$j) {
            if ( $res['films'][$i] == $res['films'][$j] && $i != $j ) {
                $filmsWhereActors['films'][$k++] = $res['films'][$i];
            }
        }
    }

    return count($filmsWhereActors['films']) > 0 ? $filmsWhereActors : $res;
}
 
Последнее редактирование:
Сверху