在PHP中动态比较这两个数组
如何将这两个php数组与最大相似值进行比较,并从array_2中获得与array_1最大匹配的键索引?我不能使用传统的if-else条件来实现这一点,因为涉及到多个条件,有没有快速而可靠的方法来实现这一点在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(
$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
。是的,在我的情况下,它是必需的。