在PHP中动态比较这两个数组

在PHP中动态比较这两个数组,php,arrays,sorting,Php,Arrays,Sorting,如何将这两个php数组与最大相似值进行比较,并从array_2中获得与array_1最大匹配的键索引?我不能使用传统的if-else条件来实现这一点,因为涉及到多个条件,有没有快速而可靠的方法来实现这一点 $array_1 = array( 'key_1'=> 'value_1', 'key_2'=> 'value_2', 'key_3'=> 'value_3' ); $array_2 = array( [1] => array(

如何将这两个php数组与最大相似值进行比较,并从array_2中获得与array_1最大匹配的键索引?我不能使用传统的if-else条件来实现这一点,因为涉及到多个条件,有没有快速而可靠的方法来实现这一点

$array_1 = array(
    'key_1'=> 'value_1',
    'key_2'=> 'value_2',
    'key_3'=> 'value_3'
);

$array_2 = array(
    [1] => array(
        'key_1'=> 'value_1',
        'key_2'=> 'value_2',
        'key_3'=> 'value_3',
        'key_4'=> 'value_4',
        'key_5'=> 'value_5'
    ),
    [2] => array(
        'key_1'=> 'value_1',
        'key_2'=> 'value_2',
        'key_3'=> 'value_3',
        'key_4'=> 'value_4',
        'key_5'=> 'value_5'
    ),
    [3] => array(
        'key_1'=> 'value_1',
        'key_2'=> 'value_2',
        'key_3'=> 'value_3',
        'key_4'=> 'value_4',
        'key_5'=> 'value_5'
    )
);
更新:

    $user_data = array();
    $user_data['country'] = get_user_cc();
    $user_data['os'] = get_user_os();
    $user_data['device'] = get_user_device();
    $user_data['bit'] = get_user_osbit();
    $user_data['browser'] = get_user_browser();

    $saved_data = get_post_meta($post->ID, 'redirects', true);

    if (!empty($saved_data)) {
        foreach ($saved_data as $data) {
            $new_data = $data;
            unset($new_data['url']);

            if($new_data['browser'] === 'NONE') {
                $user_data['browser'] = 'NONE';
            }

            if($new_data['os'] === 'NONE') {
                $user_data['os'] = 'NONE';
            }

            if($new_data['country'] === 'NONE') {
                $user_data['country'] = 'NONE';
            }

            if($new_data['device'] === 'NONE') {
                $user_data['device'] = 'NONE';
            }

            if($new_data['bit'] === 'NONE') {
                $user_data['bit'] = 'NONE';
            }  
            
            $match_count = count(array_intersect_assoc($user_data, $new_data));

            echo '<pre>';
            print_r($match_count);
            echo '</pre>';
            
        }
    }
这些是我正在使用的实际数组,我想从数组_2中获取与数组_1匹配的最大值的URL

Array_1:

Array
(
    [country] => IN
    [os] => WINDOWS
    [device] => DESKTOP
    [bit] => 64
    [browser] => CHROME
)

or 

Array
(
    [country] => IN
    [os] => WINDOWS
    [device] => DESKTOP
    [bit] => 64
    [browser] => FIREFOX
)

Array_2:

Array
(
    [1] => Array
        (
            [country] => IN
            [browser] => NONE
            [os] => WINDOWS
            [device] => DESKTOP
            [bit] => 64
            [url] => url-1
        )

    [2] => Array
        (
            [country] => IN
            [browser] => FIREFOX
            [os] => WINDOWS
            [device] => DESKTOP
            [bit] => 64
            [url] => url-2
        )

    [3] => Array
        (
            [country] => IN
            [browser] => CHROME
            [os] => MACOS
            [device] => NONE
            [bit] => NONE
            [url] => url-3
        )

) 
更新2:

    $user_data = array();
    $user_data['country'] = get_user_cc();
    $user_data['os'] = get_user_os();
    $user_data['device'] = get_user_device();
    $user_data['bit'] = get_user_osbit();
    $user_data['browser'] = get_user_browser();

    $saved_data = get_post_meta($post->ID, 'redirects', true);

    if (!empty($saved_data)) {
        foreach ($saved_data as $data) {
            $new_data = $data;
            unset($new_data['url']);

            if($new_data['browser'] === 'NONE') {
                $user_data['browser'] = 'NONE';
            }

            if($new_data['os'] === 'NONE') {
                $user_data['os'] = 'NONE';
            }

            if($new_data['country'] === 'NONE') {
                $user_data['country'] = 'NONE';
            }

            if($new_data['device'] === 'NONE') {
                $user_data['device'] = 'NONE';
            }

            if($new_data['bit'] === 'NONE') {
                $user_data['bit'] = 'NONE';
            }  
            
            $match_count = count(array_intersect_assoc($user_data, $new_data));

            echo '<pre>';
            print_r($match_count);
            echo '</pre>';
            
        }
    }
$user_data=array();
$user_data['country']=get_user_cc();
$user_data['os']=get_user_os();
$user_data['device']=get_user_device();
$user_data['bit']=get_user_osbit();
$user_data['browser']=get_user_browser();
$saved_data=get_post_meta($post->ID,'redirects',true);
如果(!空($saved_data)){
foreach($data保存为$data){
$new_data=$data;
未设置($new_data['url']);
如果($new_data['browser']='NONE'){
$user_data['browser']='NONE';
}
如果($new_data['os']='NONE'){
$user_data['os']='NONE';
}
如果($new_data['country']='NONE'){
$user_data['country']='NONE';
}
如果($new_data['device']='NONE'){
$user_data['device']='NONE';
}
如果($new_data['bit']='NONE'){
$user_data['bit']='NONE';
}  
$match_count=count(数组_intersect_assoc($user_data,$new_data));
回声';
$max_match = -1;

foreach ($saved_data as $data) {
    $temp_data = $user_data;
    $save_url = $data['url'];
    unset($temp_data['url']);

    if($data['browser'] === 'NONE') {
        $temp_data['browser'] = 'NONE';
    }

    if($data['os'] === 'NONE') {
        $temp_data['os'] = 'NONE';
    }

    if($data['country'] === 'NONE') {
        $temp_data['country'] = 'NONE';
    }

    if($data['device'] === 'NONE') {
        $temp_data['device'] = 'NONE';
    }

    if($data['bit'] === 'NONE') {
        $temp_data['bit'] = 'NONE';
    }  
            
    $match_count = count(array_intersect_assoc($user_data, $temp_data));

    if ($match_count > $max_match) {
        $max_match = $match_count;
        $url = $save_url;
    }
            
}

echo '<pre>';
print_r($url);
echo '</pre>';
打印(匹配计数); 回声';
$max_match = -1;

foreach ($saved_data as $data) {
    $temp_data = $user_data;
    $save_url = $data['url'];
    unset($temp_data['url']);

    if($data['browser'] === 'NONE') {
        $temp_data['browser'] = 'NONE';
    }

    if($data['os'] === 'NONE') {
        $temp_data['os'] = 'NONE';
    }

    if($data['country'] === 'NONE') {
        $temp_data['country'] = 'NONE';
    }

    if($data['device'] === 'NONE') {
        $temp_data['device'] = 'NONE';
    }

    if($data['bit'] === 'NONE') {
        $temp_data['bit'] = 'NONE';
    }  
            
    $match_count = count(array_intersect_assoc($user_data, $temp_data));

    if ($match_count > $max_match) {
        $max_match = $match_count;
        $url = $save_url;
    }
            
}

echo '<pre>';
print_r($url);
echo '</pre>';
} }
您不应该在循环过程中更改
$user\u data
,因为这会干扰以后的迭代。复制一份
$user\u数据
并更新该数据

您需要检查
$match\u count
是否高于当前最大值。如果是,请更新最大值并保存当前URL

$max\u match=-1;
foreach($data保存为$data){
$temp_数据=$user_数据;
$save_url=$data['url'];
未设置($temp_data['url']);
如果($data['browser']='NONE'){
$temp_data['browser']='NONE';
}
如果($data['os']='NONE'){
$temp_data['os']='NONE';
}
如果($data['country']='NONE'){
$temp_data['country']='NONE';
}
如果($data['device']='NONE'){
$temp_data['device']='NONE';
}
如果($data['bit']='NONE'){
$temp_data['bit']='NONE';
}  
$match_count=count(数组_intersect_assoc($user_data,$temp_data));
如果($match\u count>$max\u match){
$max\u match=$match\u count;
$url=$save\u url;
}
}
回声';
$max_match = -1;

foreach ($saved_data as $data) {
    $temp_data = $user_data;
    $save_url = $data['url'];
    unset($temp_data['url']);

    if($data['browser'] === 'NONE') {
        $temp_data['browser'] = 'NONE';
    }

    if($data['os'] === 'NONE') {
        $temp_data['os'] = 'NONE';
    }

    if($data['country'] === 'NONE') {
        $temp_data['country'] = 'NONE';
    }

    if($data['device'] === 'NONE') {
        $temp_data['device'] = 'NONE';
    }

    if($data['bit'] === 'NONE') {
        $temp_data['bit'] = 'NONE';
    }  
            
    $match_count = count(array_intersect_assoc($user_data, $temp_data));

    if ($match_count > $max_match) {
        $max_match = $match_count;
        $url = $save_url;
    }
            
}

echo '<pre>';
print_r($url);
echo '</pre>';
打印(url); 回声';
$max_match = -1;

foreach ($saved_data as $data) {
    $temp_data = $user_data;
    $save_url = $data['url'];
    unset($temp_data['url']);

    if($data['browser'] === 'NONE') {
        $temp_data['browser'] = 'NONE';
    }

    if($data['os'] === 'NONE') {
        $temp_data['os'] = 'NONE';
    }

    if($data['country'] === 'NONE') {
        $temp_data['country'] = 'NONE';
    }

    if($data['device'] === 'NONE') {
        $temp_data['device'] = 'NONE';
    }

    if($data['bit'] === 'NONE') {
        $temp_data['bit'] = 'NONE';
    }  
            
    $match_count = count(array_intersect_assoc($user_data, $temp_data));

    if ($match_count > $max_match) {
        $max_match = $match_count;
        $url = $save_url;
    }
            
}

echo '<pre>';
print_r($url);
echo '</pre>';

$array\u 2
中的所有元素都具有相同的值。使用
计数(array\u intersect\u assoc($x,$y))
可以获得两个数组之间相似元素的数量。然后在
$array\u 2
上循环,使用当前元素和
$array\u 1
执行此操作。如果计数高于当前最大值,请保存索引。@Barmar没有$array_2值可以是任何值,它们是动态生成的,我想将其与它匹配的最大值相匹配。我尝试了count(array\u intersect\u assoc($x,$y)),但在我的例子中似乎不起作用。您需要匹配数组的键和值,还是只匹配值?如果让示例更具代表性,在每个数组中使用不同的值会更好。然后说应该选择哪个元素作为结果。这一行应该是$match\u count=count(array\u intersect\u assoc($user\u data,$data));谢谢你的帮助,这给了我做这项工作的初步想法。我以为你在填写
NONE
字段后想要进行比较,为什么还要这样做呢?是的,但这里我们设置了$temp\u data=$user\u data;因此,array_intersect_assoc($user_data,$temp_data)将比较同一数组。否,因为所有
if
语句都会更改
$temp_data
。是的,在我的情况下,它是必需的。