Возврат Array итолько после сравнения

chishikinohito

Новичок
Дорогие друзья, привет!

Уже нет сил, замучался разбираться, наверное потому что я новичок в PHP.

У меня есть два многомерных массива. я хочу провести такую операцию когда

$newarray = (array1 - array2)

Т.е. я хочу в $newarray вернуть массив 1 с полным его содержанием, но за исключением того, что находится в массиве 2. Массивы по ключевому содержанию значений идентичны. По количеству значений в нем, нет. На каждый ключ приходится около 50 элементов.


я думал что так будет работать, но что-то не правильно работает?
PHP:
$newarray = array_diff_assoc($videos, $videosremove);
знающие люди, можете помоч пожалуйста!
 

chishikinohito

Новичок
вот как выглядит например массив 2

PHP:
Array ( 

[0] => Array ( 

[0] => 4 [VID] => 4 [1] => 2 [UID] => 2 [2] => Heian Nidan [title] => Heian Nidan [3] => Performed by Sensei Osaka [description] => Performed by Sensei Osaka [4] => [featuredesc] => [5] => h2 nidan [keyword] => h2 nidan [6] => [titlerus] => [7] => [descriptionrus] => [8] => [featuredescrus] => [9] => [keywordrus] => [10] => 0|1|0 [channel] => 0|1|0 [11] => 4.flv [vdoname] => 4.flv [12] => 4.f4v [flvdoname] => 4.f4v [13] => 93.622 [duration] => 93.622 [14] => 9 [space] => 9 [15] => public [type] => public [16] => 1320484721 [addtime] => 1320484721 [17] => 2011-11-05 [adddate] => 2011-11-05 [18] => 0000-00-00 [record_date] => 0000-00-00 [19] => [location] => [20] => Select Country [country] => Select Country [21] => 3e71d9181a67b7542122 [vkey] => 3e71d9181a67b7542122 [22] => 0 [viewnumber] => 0 [23] => 0000-00-00 00:00:00 [viewtime] => 0000-00-00 00:00:00 [24] => 0 [com_num] => 0 [25] => 0 [fav_num] => 0 [26] => no [featured] => no [27] => 0 [ratedby] => 0 [28] => 0 [rate] => 0 [29] => [filehome] => [30] => yes [be_comment] => yes [31] => yes [be_rated] => yes [32] => enabled [embed] => enabled [33] => [embed_code] => [34] => 2 [thumb] => 2 [35] => [voter_id] => [36] => 1 [active] => 1 [37] => 9.0.115 [flash_version] => 9.0.115 [38] => 640 [width] => 640 [39] => 480 [height] => 480 [40] => 0 [original_width] => 0 [41] => 0 [original_height] => 0 [42] => 320 [mini_width] => 320 [43] => 240 [mini_height] => 240 [44] => 0 [full_width] => 0 [45] => 0 [full_height] => 0 [46] => 4:3 [ratio] => 4:3 [47] => 1 [deblock] => 1 [48] => 4_mini.f4v [mini_filename] => 4_mini.f4v [49] => [full_filename] => [50] => 1320484825 [conv_end_time] => 1320484825 [51] => rotate [thumb_type] => rotate )

[1] => Array ( 

[0] => 1 [VID] => 1 [1] => 2 [UID] => 2 [2] => Takiyoko Shodan [title] => Takiyoko Shodan [3] => Performed by Sensei Kawasoe [description] => Performed by Sensei Kawasoe [4] => [featuredesc] => [5] => Takiyoko [keyword] => Takiyoko [6] => [titlerus] => [7] => [descriptionrus] => [8] => [featuredescrus] => [9] => [keywordrus] => [10] => 0|1|0 [channel] => 0|1|0 [11] => 1.flv [vdoname] => 1.flv [12] => 1.f4v [flvdoname] => 1.f4v [13] => 47.415 [duration] => 47.415 [14] => 5 [space] => 5 [15] => public [type] => public [16] => 1320484344 [addtime] => 1320484344 [17] => 2011-11-05 [adddate] => 2011-11-05 [18] => 0000-00-00 [record_date] => 0000-00-00 [19] => [location] => [20] => Select Country [country] => Select Country [21] => 923820dcc509a6f75849 [vkey] => 923820dcc509a6f75849 [22] => 10 [viewnumber] => 10 [23] => 2011-11-08 13:23:33 [viewtime] => 2011-11-08 13:23:33 [24] => 0 [com_num] => 0 [25] => 0 [fav_num] => 0 [26] => no [featured] => no [27] => 1 [ratedby] => 1 [28] => 8 [rate] => 8 [29] => [filehome] => [30] => yes [be_comment] => yes [31] => no [be_rated] => no [32] => disabled [embed] => disabled [33] => [embed_code] => [34] => 2 [thumb] => 2 [35] => |2| [voter_id] => |2| [36] => 1 [active] => 1 [37] => 9.0.115 [flash_version] => 9.0.115 [38] => 320 [width] => 320 [39] => 240 [height] => 240 [40] => 0 [original_width] => 0 [41] => 0 [original_height] => 0 [42] => 320 [mini_width] => 320 [43] => 240 [mini_height] => 240 [44] => 0 [full_width] => 0 [45] => 0 [full_height] => 0 [46] => 4:3 [ratio] => 4:3 [47] => 1 [deblock] => 1 [48] => 1_mini.f4v [mini_filename] => 1_mini.f4v [49] => [full_filename] => [50] => 1320484371 [conv_end_time] => 1320484371 [51] => rotate [thumb_type] => rotate ) )

Хотя мне просто достаточно сравнить массивы только по ключу VID, который уникальный для обоих массивов и вернуть реультат?

Это ведь не трудно, кто знает, ребята?
 

chishikinohito

Новичок
он выдает мешанину, поскольку сравнивает по всем ключам, как я понимаю

PHP:
array(13) { [2]=> array(104) { [0]=> string(1) "3" ["VID"]=> string(1) "3" [1]=> string(1) "2" ["UID"]=> string(1) "2" [2]=> string(19) "Heian Shodan Bunkai" ["title"]=> string(19) "Heian Shodan Bunkai" [3]=> string(25) "Performed by Sensei Osaka" ["description"]=> string(25) "Performed by Sensei Osaka" [4]=> string(0) "" ["featuredesc"]=> string(0) "" [5]=> string(16) "h1 shodan bunkai" ["keyword"]=> string(16) "h1 shodan bunkai" [6]=> string(0) "" ["titlerus"]=> string(0) "" [7]=> string(0) "" ["descriptionrus"]=> string(0) "" [8]=> string(0) "" ["featuredescrus"]=> string(0) "" [9]=> string(0) "" ["keywordrus"]=> string(0) "" [10]=> string(5) "0|1|0" ["channel"]=>
вот что мне нужно так это наверное добавить функию и сравнить два этих массива только по одному ключу VID из каждого значения?

VID уникальное значени! если VID присутствует в массиве 2 то в результаты ($newarray) оно (VID) и все что за ним следует, уже попасть не должено.

в массиве 1 присутствуют ВСЕ VID в массиве 2 только некоторые или вообще пустой..

Как это правильно сделать?
 

Redjik

Джедай-мастер
Блин, русский не родной? Я тебя очень с трудом понимаю... если правильно понял, то в массиве 1 и 2 есть как разные, так и одинаковые ключи, а тебе нужны только ключи массива 1, которые повторяются в массиве 2


вообще есть array_intersect
 

chishikinohito

Новичок
Смотри, русский родной, уже шарики за ролики заехали!

в массиве 1 есть все результаты которые могут пристутствовать в массиве 2.

Новый массив должен содержать массив 1, исключая все содержимое массива 2, которое постоянно меняется. но по структуре массивы конечно же одинаковые.

Как написать функцию правильно чтобы сравнивать два массива по кулючу VID? я правильно понимаю ход событий?

Вот как написанно в примерах, но как это сделать это в моем многомерном массиве чтобы a и b соотносились в VID:
PHP:
function key_compare_func($a, $b) 
{
    if ($a === $b) {
        return 0;
    }
    
}


$result = array_diff_uassoc($videos, $videosremove, "key_compare_func");
 

chishikinohito

Новичок
Так ребята, кто-нибудь знает как сравнить два многомерных массива и на выходе получить новый массив, который представлял бы разницу первого массива от второго? Не могу поверить, что это так трудно?
 

chishikinohito

Новичок
пойду нырну в холодную ванну скоро.. :)
да, есть, но работает корректоно только и то наоборот

PHP:
$result = array_intersect_assoc($videosremove, $videos);
print_r($result);
т.е. она выдает "правильный" результат, но только тех видео которые присутствуют в $videosremove фактически ее просто перепечатывая..

АААА.. Мне нужно чтобы вся эта хрень содержащаяся в массиве 2 ($videosremove) не попадала в массив 1 ($videos)
 

Здыхлик

Kohaner
Команда форума
Гм, а что мешает в массивах использовать значения VID в качестве ключей. Т.е. примерно так:
PHP:
Array ( 

[4] => Array ( 
     [0] => 4 [VID] => 4 [1] => 2 [UID] => 2 [2] => Heian Nidan [title] => Heian Nidan ... 
)

[1] => Array ( 
    [0] => 1 [VID] => 1 [1] => 2 [UID] => 2 [2] => Takiyoko Shodan [title] => Takiyoko Shodan ...) 
)
Понимаю, что это не решение поставленной задачи, но так ведь намного удобнее работать с подобными массивами.
 

chishikinohito

Новичок
Ну, так вот, все что мне нужно так это убрать из массива 1 результаты массива 2 и назвать его массив 3. т.е. array3 = array1-array2

И можно использовать ключ VID чтобы дать php понять, что если VID присутствует в массиве 2, то его (и всю требуху к нему относящуюся), включать в результаты (массив 3) уже нельзя).

Не могу сделать, чувствую себя малоумным иногда, например сейчас.

Кто может кинуть работающую конструкцию, пожалуйста?
 

Semen

Семён
PHP:
$videosDiff = array_diff_key($videos, $videosremove);
может это?
покажи $videos и $videosremove
 

chishikinohito

Новичок
я попробовал твое предложение - работатет, НО!! мешает результаты, т.е. в конечном счете не работает правильно.. когда удаляешь VID 5 например, показываеться в результата, то, что было добавленно в ПОСЛЕДНИМ в таблицу group_vdo. А в результах долно появиться именно VID 5!

вот пожалуйста
videoremove
PHP:
$sql            = "SELECT * FROM group_vdo WHERE GID = '" .$GID. "'" . " ORDER BY VID ASC LIMIT " .$limit;
$rs             = $conn->execute($sql);
$videosremove         = array();

if ( $conn->Affected_Rows() ) {
    $i  = 0;
    while ( !$rs->EOF ) {
        $sql    = "SELECT * FROM video WHERE VID = '" .$rs->fields['VID']. "' LIMIT 1";
        $rsv    = $conn->execute($sql);
        if ( $conn->Affected_Rows() ) {
            $video                  = $rsv->getrows();
            $videosremove[$i]             = $video['0'];
            $rs->movenext();
            ++$i;
        }
    }
}
PHP:
$videos
$sql                = "SELECT * FROM video WHERE type = 'public'";
$rs                 = $conn->execute($sql);
$videos             = $rs->getrows();
 

chishikinohito

Новичок
или как переделать запрос к MySQL, так, чтобы $new_result = $videos - $videosremove, но не посредством php, а посредством запроса к DB? хотя мне лижбы работало..
 

chishikinohito

Новичок
А вообще я думаю, что нужно сравнить только ключи VID и все, использовав функцию, как только это сделать?
 

Semen

Семён
похоже ты всё усложняешь...
покажи структуру таблиц video и group_vdo
 

chishikinohito

Новичок
group_vdo

AID GID VID
58 2 12
53 2 13
3 2 3
61 2 4
5 2 5
59 2 1
7 2 7
47 5 1
9 2 9
10 2 10
56 2 11
54 2 16
57 2 14
60 2 2
49 2 6
51 2 8

video
и видео, не до конца (51 значение)

VID UID title description featuredesc keyword titlerus descriptionrus featuredescrus keywordrus channel vdoname flvdoname duration space type

дело в том, что по средству твоего примера, он показывает последнее добавленное видео в таблицу video., когда удаляешь его из group_vdo и при условии, что оно последнее (в video), то показывается уже предпоследнее.. и т.д..
 

chishikinohito

Новичок
т.е. я просто хочу, чтобы те видео которые были добавленны в group_vdo уже не появлялись в результатах video. но результаты video это все все все видео какие есть... а в group_vdo содеражаться только vID тех видео которые имеют принадлежность к группе.

заходим в группу 1.

видим

добавить видео

все 10 видео, например

Удалить видео из группы

0 видео


дальше нажимаем в секции добавить видео кнопку добавить, и видео появляется в секции Удалить Видео,

так СЕЙЧАС видим,


добавить видео

всего 10 видео

Удалить видео из группы

1 видео (то которое было добавленно)


а я ХОЧУ УВИДЕТЬ


добавить видео

9 видео (то одно которое добавленно в группу - уйти должно отсюда)

Удалить видео из группы

1 видео


Вот как все просто в результатах.. т.е. то что добавили в группу, уже не должно появляться в общих видео и предлогать себя добавить еще раз, т.к. оно уже там...
 

Semen

Семён
попробуй такую выборку
PHP:
SELECT * FROM `video`
WHERE `VID` NOT IN  (SELECT `VID` FROM `group_vdo`);
 

Semen

Семён
или такую
PHP:
SELECT * FROM `video`
LEFT JOIN `group_vdo`
ON (`video`.`VID` = `group_vdo`.`VID`)
WHERE `group_vdo`.`VID` IS NULL;
 
Сверху