在PHP中查找数组元素之间的相似性(而不是重复)?
我正在寻找一种在PHP中查找数组中的相似性(而不是实际的重复项)的方法,以便获得“更大的图像”。本质上,我是在特定Instagram帖子上抓取标签,然后寻找它们之间的相关性和标签关系数据库 目前我有一个数组,看起来像:在PHP中查找数组元素之间的相似性(而不是重复)?,php,arrays,Php,Arrays,我正在寻找一种在PHP中查找数组中的相似性(而不是实际的重复项)的方法,以便获得“更大的图像”。本质上,我是在特定Instagram帖子上抓取标签,然后寻找它们之间的相关性和标签关系数据库 目前我有一个数组,看起来像: array(15) { ["vietnam"]=> int(1617) ["vietnamtravel"]=> int(788) ["vietnamnow"]=> int(736) ["travelphotography"]=>
array(15) {
["vietnam"]=>
int(1617)
["vietnamtravel"]=>
int(788)
["vietnamnow"]=>
int(736)
["travelphotography"]=>
int(583)
["visitvietnam"]=>
int(540)
["hanoihandbook"]=>
int(514)
["travel"]=>
int(505)
["travelblogger"]=>
int(491)
["vietnamtrip"]=>
int(468)
["bestintravel"]=>
int(462)
["sunsetporn"]=>
int(460)
["instavietnam"]=>
int(460)
["sky_sultans"]=>
int(453)
["ig_sunsetshots"]=>
int(423)
["traveller"]=>
int(406)
}
其中int()表示相关性
我试图实现的是从中提取主要关键字,以获得包含“越南”、“旅行”、“摄影”、“日落”等内容的数组
蛮力的方法是将数组的每个元素与数组的其余部分进行比较,看看能找到多少次?这对于“越南”和“旅行”来说效果很好,因为它们已经在阵列中了。然而,它不能让我提取“日落”或“摄影”的例子
有什么想法吗?:)
谢谢
如果您需要在(PHP函数)中使用此关键字标记标记,请使用下一个代码:
echo "length of data array = ".count($data_ar)."\r\n";
$keys_like = ["vietnam","travel","sunset","photography"];
function new_arr ($keys, $data){
$res = [];
foreach($data as $key => $val){
foreach($keys as $k){
if(stristr($key, $k)){
$res[$key] = $data[$key];
}
}
}
return $res;
}
$res_arr = new_arr($keys_like, $data_ar);
echo "length of resultant array = ".count($res_arr)."\r\n";
print_r($res_arr);
在这里,您可以通过$keys\u like
选择所需的键
借助@RakeshJakhar'函数,您可以在$data array
中看到最大出现次数:
function _parseRecursive(&$array, &$carry){
array_filter($array);
$first = array_shift($array);
$array = array_map(function($v) use ($first){
return str_replace($first, '', $v);
}, $array);
$carry[] = $first;
if(!$array)
return array_filter($carry);
return _parseRecursive($array, $carry);
}
function new_arr ($data, $rec_keys){
$res = [];
foreach($rec_keys as $item){
$res[$item] = 0;
foreach($data as $key => $val){
if(stristr($key, $item)){
$res[$item] += 1;
}
}
}
return $res;
}
$data_keys = [];
foreach($data_ar as $key=>$val){
$data_keys[] = $key;
}
$rec_arr = _parseRecursive($data_keys, $res);
$res_arr = new_arr($data_ar, $rec_arr);
arsort($res_arr);
print_r($res_arr);
我认为这对你有帮助,如果没有,请忽略它
<?php
$whitelist = ["home","dashboard","profile","group"];
$possibleUserInputs = ["homd","hom","ashboard","settings","group"];
foreach($possibleUserInputs as $input)
{
if(preg_grep("/$input/i",$whitelist)
{
echo $input." whitelisted";
}else{
echo $input." flawed";
}
}
?>
这可能会有所帮助,您可以从第一个数组元素开始解析数组
function _parseRecursive(&$array, &$carry){
array_filter($array);
$first = array_shift($array);
$array = array_map(function($v) use ($first){
return str_replace($first, '', $v);
}, $array);
$carry[] = $first;
if(!$array)
return array_filter($carry);
return _parseRecursive($array, $carry);
}
像这样使用它
$result = _parseRecursive($a, $res);
工作示例:您希望得到什么结果?我期待一个包含“越南”、“旅游”、“摄影”和“日落”的数组。“我试图从中提取主要关键字”-然后提供这些关键字的完整列表,或者解释你想如何确定“主要关键字”实际上是什么。这就是问题所在,我不知道这些主要关键字是什么。我正在寻找数组中的相关性,这些相关性将指向数组的主题是什么。在这个数组中,单词“travel”和“Vietname”经常会弹出,因此可以安全地假设它们是数组中所有内容的主题。问题是,我需要输入我想要的结果。结果应该是$keys_like,而不是输入。我无法提前知道结果会是什么。