Проверьте, равно ли значение ключа в одном массиве значению другого ключа в другом массиве. - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть 2 многомерных массива, и я хочу получить 1-й массив, где значение ключа [file] в массиве 1 равно значению ключа [folder_name] в массиве 2

$arr1 = [
    [
        'is_dir'      => '1',
        'file'        => 'hello member',
        'file_lcase'  => 'hello member',
        'date'        => '1550733362',
        'size'        => '0',
        'permissions' => '',
        'extension'   => 'dir',
    ],
    [
        'is_dir'      => '1',
        'file'        => 'in in test',
        'file_lcase'  => 'in in test',
        'date'        => '1550730845',
        'size'        => '0',
        'permissions' => '',
        'extension'   => 'dir',
    ]
];

$arr2 = [
    [
        'dic_id'      => '64',
        'folder_name' => 'hello member',
        'share_with'  => '11',
    ],
    [
        'dic_id'      => '65',
        'folder_name' => 'hello inside',
        'share_with'  => '11',
    ],
    [
        'dic_id'      => '66',
        'folder_name' => 'in in test',
        'share_with'  => '11',
    ],
];

У меня естьпытался зациклить 2 массива и получить один массив, но это не удалось.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019
$arr1 = array();
$arr2 = array();
$arr3 = array();
$arr1[] = array('is_dir'=>'1','file'=>'hello member','file_lcase'=>'hello member','date'=>'1550733362','size'=>'0','permissions'=>'','extension'=>'dir');
$arr1[] = array('is_dir'=>'1','file'=>'in in test','file_lcase'=>'in in test','date'=>'1550730845','size'=>'0','permissions'=>'','extension'=>'dir');
$arr2[] = array('dic_id'=>'64','folder_name'=>'hello member','share_with'=>'11');
$arr2[] = array('dic_id'=>'65','folder_name'=>'hello member','share_with'=>'11');
$arr2[] = array('dic_id'=>'66','folder_name'=>'in in test','share_with'=>'11');

foreach($arr1 as $a){
    foreach($arr2 as $a2){
        if($a['file'] == $a2['folder_name']){
            $arr3[]=$a;
        }
    }
}
$arr3 = array_map("unserialize", array_unique(array_map("serialize", $arr3))); // remove duplicates
var_dump($arr3);

$ arr3 содержит результирующий массив.

0 голосов
/ 21 февраля 2019

Чтобы избежать двойного цикла, который дает временную сложность O (n²) , вы можете сначала создать набор значений "имя_папки" (в качестве ключей), а затем использовать его для фильтрации первого массива.,Обе эти операции имеют временную сложность O (n) , что, безусловно, более эффективно для больших массивов:

$result = [];
$set = array_flip(array_column($arr2, "folder_name"));
foreach ($arr1 as $elem) {
    if (isset($set[$elem["file"]])) $result[] = $elem;
}

$result будет иметь элементы $arr1, которые соответствуютТребование.

0 голосов
/ 21 февраля 2019

Мы можем перебирать оба массива друг в друге, чтобы проверять, пока у нас не будет совпадения.

Обратите внимание, что это показывает только первое совпадение.Если вы хотите сохранить все совпадения, используйте другой помощник array для хранения значений первого массива, соответствующих второму массиву.

foreach ($array1 as $key => $value) {
    foreach ($array2 as $id => $item) {
        if($value['file'] == $item['folder_name']){
            // we have a match so we print out the first array element
            print_r($array1[$key]);
            break;
        }
    }
}
...