在我的网站中,用户可以使用不同的语言发布他们的个人资料,例如LinkedIn,现在我们在用户的名字之间搜索,例如我们搜索:“ar
”并查看所有个人资料语言,我们将有一个数组作为回报:
array
0 => string '20=>en' (length=5)
1 => string '42=>en' (length=5)
2 => string '20=>fa' (length=5)
3 => string '42=>sp' (length=5)
4 => string '12=>fr' (length=5)
5 => string '83=>ar' (length=5)
6 => string '160=>sp' (length=5)
上面的数组显示我们有6个配置文件与不同语言的搜索“ar
”匹配,上面的数组显示:
0 => Match found for User with ID = 20 in English Lang(en) profile
1 => Match found for User with ID = 42 in English Lang(en) profile
2 => Match found for User with ID = 20 in Farsi Lang(fa) profile
3 => Match found for User with ID = 42 in Spanish Lang(sp) profile
4 => Match found for User with ID = 12 in French Lang(fr) profile
5 => Match found for User with ID = 83 in Arabic Lang(ar) profile
6 => Match found for User with ID = 160 in Spanish Lang(sp) profile
现在,我们想要显示结果,但事实上,正如您在结果中看到的那样,我们为两个{{ID = 20的用户提供了“ar
”匹配1}}和English
种语言,但我们无法显示同一个人的2个结果!所以我们需要放弃腋下结果,所以上面的数组应该根据用户ID和语言的优先级进行过滤和统一,我的语言优先级是:
输入“Farsi
”作为其搜索查询的人员为ar
,因此在结果为$_SESSION['my_lang']
的用户的结果数组中,我们应该保留该结果并让去找同一个人的其他比赛。
在$_SESSION['my_lang']
之后,我们的优先级应该是 EN lang ,如果某人有N种语言的结果,但我们无法在$_SESSION['my_lang']
中找到匹配项,那么我们应该将结果保存在 en lang 中,清除该人的其他结果。
在上述优先级之后,实际上没什么问题,我们只需要为该人保留一个结果并除去该人的其他结果,因此应该随机选择语言。
我不知道如何实现这一目标, 我会感激任何帮助。
在我的例子中,我有一个像:
这样的数组$_SESSION['my_lang']
但在您的示例中,您有一个类似的数组:
array
0 => string '20=>en' (length=5)
1 => string '42=>en' (length=5)
2 => string '20=>fa' (length=5)
3 => string '42=>sp' (length=5)
4 => string '12=>fr' (length=5)
5 => string '83=>ar' (length=5)
6 => string '160=>sp' (length=5)
我应该如何让我的数组看起来像你的数组,所以你的代码工作..?感谢
答案 0 :(得分:1)
可能有更好(更有效)的方法,但这是一种方法。分3步完成。 (1)创建语言数组,(2)命令用户数组,基于语言数组,(3)使User数组具有唯一用户。
note 第2步使用匿名函数,因此如果PHP v< 5.3,使用第二步骤2示例
用户数组
$users = array(
array('id'=> 20, 'lang'=>'en'),
array('id'=> 42, 'lang'=>'en'),
array('id'=> 20, 'lang'=>'fa'),
array('id'=> 42, 'lang'=>'sp'),
array('id'=> 12, 'lang'=>'fr'),
array('id'=> 83, 'lang'=>'ar'),
array('id'=> 160, 'lang'=>'sp'));
第1步
//Create an Array of Languages
$langs[0] = $_SESSION['my_lang']; // Set $_SESSION['my_lang'] as 1st
if($langs[0] != 'en'){
$langs[1] = 'en';} // Set en as 2nd, if not already as 1st
//Add remainder of User languages to Languages
shuffle($users); // This randomizes the $user array so the rest of the languages are random. Can be removed if randomizing the rest of the languages is not necessary.
foreach ($array as $lang) {
if(!in_array($lang['lang'],$langs))
$langs[] =$lang['lang'];
}
第2步使用php v> = 5.3 - 使用匿名函数
//Reorder the User array, bases off Language array
$keys = array_flip($langs);
usort($users, function($a, $b) use($keys)
{
return $keys[$a['lang']] - $keys[$b['lang']];
});
第2步使用php v< 5.3
//Reorder the User array, bases off Language array
$keys = array_flip($langs);
function custom($a,$b){
global $keys;
return $keys[$a['lang']] - $keys[$b['lang']];
}
usort($users, "custom");
第3步
//Make the User array unique
$temp_array = array();
foreach ($users as &$v) {
if (!isset($temp_array[$v['id']]))
$temp_array[$v['id']] =&$v;
}
$users = array_values($temp_array);
phpFiddle w / step 2 for php v> = 5.3 - http://phpfiddle.org/main/code/xva-dzn
phpFiddle w / step 2 for php v< 5.3 - http://phpfiddle.org/main/code/p02-r6b
修改强>
假设你的阵列 -
array
0 => string '20=>en' (length=5)
1 => string '42=>en' (length=5)
2 => string '20=>fa' (length=5)
3 => string '42=>sp' (length=5)
4 => string '12=>fr' (length=5)
5 => string '83=>ar' (length=5)
6 => string '160=>sp' (length=5)
是这样的事件的var_dump()
-
$returned = array(
0 => '20=>en',
1 => '42=>en',
2 => '20=>fa',
3 => '42=>sp',
4 => '12=>fr',
5 => '83=>ar',
6 => '160=>sp');
使用explode()
和for()
循环,您可以将数组更改为多个数组,以便在上述步骤中使用。
$users = array();
for($i=0;$i<count($returned);$i++){
$split_returned = explode("=>",$returned[$i]); // split up each line at the '=>'
$users[$i]['id'] = $split_returned[0]; // set the 'id'
$users[$i]['lang'] = $split_returned[1];} // set the 'lang'