Сравните разные структуры массивов - PullRequest
0 голосов
/ 04 июня 2018

У меня есть два массива с разными структурами.Массив 1 и Массив 2, которые я назову из MyList и MyFiles.Я хотел бы вернуть только те значения MyList, которых нет в MyFiles.Но два массива имеют разную структуру, и у меня возникают проблемы при попытке сравнить

MyList

Array
(
    [info] => Array
        (
            [0] => Array
                (
                    [player] => Messi
                    [week] => Array
                        (
                            [id] => 252
                            [videos] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 2929850
                                            [link] => goals.mp4
                                        )

                                    [1] => Array
                                        (
                                            [id] => 2929848
                                            [link] => best.mp4
                                        )

                                    [2] => Array
                                        (
                                            [id] => 2929847
                                            [link] => dribbling.mp4
                                        )

                                )

                        )

                )

            [1] => Array
                (
                    [player] => CR7
                    [week] => Array
                        (
                            [id] => 251
                            [videos] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 2929796
                                            [link] => goals.mp4
                                        )

                                    [1] => Array
                                        (
                                            [id] => 2929795
                                            [link] => best.mp4
                                        )

                                )

                        )

                )

            [2] => Array
                (
                    [player] => Neymar
                    [week] => Array
                        (
                            [id] => 253
                            [videos] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 2929794
                                            [link] => goals.mp4
                                        )

                                    [1] => Array
                                        (
                                            [id] => 2929793
                                            [link] => best.mp4
                                        )

                                )

                        )

                )

        )

)

Массив MyFiles

Array
(
    [252] => Array
        (
            [0] => Array
                (
                    [id] => 2929850
                    [link] => goals.mp4
                )

            [1] => Array
                (
                    [id] => 2929848
                    [link] => best.mp4
                )

        )

    [251] => Array
        (
            [0] => Array
                (
                    [id] => 2929796
                    [link] => goals.mp4
                )

            [1] => Array
                (
                    [id] => 2929795
                    [link] => best.mp4
                )

        )

)

сравнение должно быть выполнено по idнедели и id видео

Я пробовал это, но это не сработало:

$new = array();
    foreach ($list['info'] as $source) {

        foreach ($source["week"]['videos'] as $keys => $videos) {


            foreach ($file as $key => $upload) {

                if ($source["week"]["id"] == $key ) {
                    for($i=0; $i<count($source["week"]["videos"]); $i++){

                        if($videos["id"] == $upload[$i]["id"]){
                            unset($videos);

                            }else{

                            $new[] = $videos;
                        }
                    }

                    } else {

                    $new[] = $videos;
                }

            }

        }
    }

Ожидаемый доход будет примерно таким:

Array
(
    [info] => Array
        (
            [0] => Array
                (
                    [player] => Messi
                    [week] => Array
                        (
                            [id] => 252
                            [videos] => Array
                                (
                                   [2] => Array
                                        (
                                            [id] => 2929847
                                            [link] => dribbling.mp4
                                        )

                                )

                        )

                )
            [2] => Array
                (
                    [player] => Neymar
                    [week] => Array
                        (
                            [id] => 253
                            [videos] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 2929794
                                            [link] => goals.mp4
                                        )

                                    [1] => Array
                                        (
                                            [id] => 2929793
                                            [link] => best.mp4
                                        )

                                )

                        )

                )

        )

)

1 Ответ

0 голосов
/ 04 июня 2018

Я спрятал массив в пригодном для использования формате для себя в будущем, если этот ответ будет неправильным и нуждается в изменении.

$desired = array();
$desired['info'][0]['player'] = 'Messi';
$desired['info'][0]['week']['id'] = 252;
$desired['info'][0]['week']['videos'][2]['id'] = 2929847;
$desired['info'][0]['week']['videos'][2]['link'] = 'dribbling.mp4';
$desired['info'][2]['player'] = 'Neymar';
$desired['info'][2]['week']['id'] = 253;
$desired['info'][2]['week']['videos'][0]['id'] = 2929794;
$desired['info'][2]['week']['videos'][0]['link'] = 'goals.mp4';
$desired['info'][2]['week']['videos'][1]['id'] = 2929793;
$desired['info'][2]['week']['videos'][1]['link'] = 'best.mp4';

$list = array();
$list["info"][0]["player"] = "Messi";
$list["info"][0]["week"]["id"] = "252";
$list["info"][0]["week"]["videos"][0]["id"] = 2929850;
$list["info"][0]["week"]["videos"][0]["link"] = "goals.mp4";
$list["info"][0]["week"]["videos"][1]["id"] = 2929848;
$list["info"][0]["week"]["videos"][1]["link"] = "best.mp4";
$list["info"][0]["week"]["videos"][2]["id"] = 2929847;
$list["info"][0]["week"]["videos"][2]["link"] = "dribbling.mp4";
$list["info"][1]["player"] = "CR7";
$list["info"][1]["week"]["id"] = "251";
$list["info"][1]["week"]["videos"][0]["id"] = 2929796;
$list["info"][1]["week"]["videos"][0]["link"] = "goals.mp4";
$list["info"][1]["week"]["videos"][1]["id"] = 2929795;
$list["info"][1]["week"]["videos"][1]["link"] = "best.mp4";
$list["info"][2]["player"] = "Neymar";
$list["info"][2]["week"]["id"] = "253";
$list["info"][2]["week"]["videos"][0]["id"] = 2929794;
$list["info"][2]["week"]["videos"][0]["link"] = "goals.mp4";
$list["info"][2]["week"]["videos"][1]["id"] = 2929793;
$list["info"][2]["week"]["videos"][1]["link"] = "best.mp4";

$file = array();
$file[252][0]['id'] = 2929850;
$file[252][0]['link'] = 'goals.mp4';
$file[252][1]['id'] = 2929848;
$file[252][1]['link'] = 'best.mp4';
$file[251][0]['id'] = 2929796;
$file[251][0]['link'] = 'goals.mp4';
$file[251][1]['id'] = 2929795;
$file[251][1]['link'] = 'best.mp4';

Редактировать

function array_diff_assoc_recursive($array1, $array2) {
    $difference=array();
    foreach ($array1 as $key => $value) {
        if (is_array($value)) {
            if( !isset($array2[$key]) || !is_array($array2[$key])) {
                $difference[$key] = $value;
            } else {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if (!empty($new_diff))
                    $difference[$key] = $new_diff;
            }
        } else if (!array_key_exists($key,$array2) || $array2[$key] !== $value) {
            $difference[$key] = $value;
        }
    }
    return $difference;
}

$new = array('info' => array());
foreach ($list['info'] as $key => $item) {
    $a = $item['week']['videos'];
    //$b = $file[$item['week']['id']] ?? []; // This is PHP7+
    $b = isset($file[$item['week']['id']]) ? $file[$item['week']['id']] : [];
    $c = array_diff_assoc_recursive($a, $b);

    if (!empty($c)) {
        $new['info'][$key] = $item;
        $new['info'][$key]['week']['videos'] = $c;
    }
}

Вам понадобится функция, которая будет проверять разницу между массивами видео.

Что я делаю, этопросто переберите массив списка, а затем проверьте разницу между этим элементом и массивом файлов.Затем разница сохраняется в $c.

. Если есть разница, то запускается оператор, который сохраняет этот проигрыватель в массиве $new, а затем заменяет массив видео на массив разностей.
Это похоже на то, что вы делали, когда сбрасывали переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...