PHP数组-排序和优先级
在我的网站上,用户可以用不同的语言发布他们的个人资料,比如LinkedIn,现在我们在用户的名字之间搜索,例如我们搜索:“PHP数组-排序和优先级,php,arrays,Php,Arrays,在我的网站上,用户可以用不同的语言发布他们的个人资料,比如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'
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的用户,我们已经在English
和Farsi
两种语言中找到了“ar
”的匹配项,但我们无法显示同一个人的两个结果!所以我们需要忽略腋窝结果,所以上面的数组应该根据用户ID和语言优先级进行过滤和唯一,我对语言的优先级是:
ar
”的人有一个$\u会话['my\u lang']
,因此在用户的结果数组中,对于在$\u会话['my\u lang']
中有结果的用户,我们应该保留该结果,并放弃同一个人的其他匹配项
在$\u会话['my_lang']
之后,我们的优先级应该是EN lang,如果一个人有N种语言的结果,但我们在$\u会话['my_lang']
中找不到匹配项,那么我们应该将结果保留在EN 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)
$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'));
但在您的示例中,有一个数组,如:
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)
$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) 创建语言数组,(2)根据语言数组对用户数组进行排序,(3)使用户数组具有唯一的用户
注意步骤2使用匿名函数,因此如果PHPV<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/第2步,适用于php v>=5.3-
phpFiddle,带步骤2,适用于PHPV<5.3-
编辑
假设你的数组-
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\u 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'
$users=array();
对于($i=0;$i可能有更好(更有效)的方法,但这里有一种方法。分3步进行。(1)创建语言数组,(2)根据语言数组排序用户数组,(3)使用户数组具有唯一的用户
注意步骤2使用匿名函数,因此如果PHPV<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/第2步,适用于php v>=5.3-
phpFiddle,带步骤2,适用于PHPV<5.3-
编辑
假设你的数组-
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\u 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'
$users=array();
对于($i=0;$iIt听起来您可能希望在执行搜索查询的任何内容中包括此限制/排序,而不是在返回的数据数组中。@MattRazza搜索查询非常复杂,我刚刚发现有许多连接和筛选…我更喜欢限制结果,知道吗?听起来您可能希望包括在执行搜索查询的任何对象中,而不是在返回的数据数组中,都存在此限制/排序。@MattRazza搜索查询真的很复杂,我刚刚发现,通过许多连接和筛选,我更喜欢限制结果,有什么想法吗?回答得很好!这会占用大量CPU/Ram吗?有什么更有效的方法吗很遗憾,我在CPU/Ram基准测试方面帮不了什么忙,因为我对这方面不太在行。我在当前阵列上运行了3次,运行时间相当小-0.000227928161621
/0.000319004058838
/0.000295877456665
,但我不知道它对CPU/Ram的使用有什么影响我唯一的建议是找到一种方法将其添加到您的查询中,但正如您在上面的评论中所提到的,您的查询已经很复杂。因此我不确定是否还有其他选择。我假设您的数组是var\u dump()
你的实际数组。如果是这样的话,我已经发布了对我的问题的编辑,展示了如何使用explode()
和for()更改你的数组
循环。很抱歉再次打扰您,但我的服务器PHP版本似乎不支持步骤2
,在PHP<5.3
中执行步骤2
还有其他方法吗,谢谢。我已经更新了步骤2,并添加了如何使用PHPV<5.3执行的方法&在原始phpFiddle linkExcellent答案旁边添加了一个phpFiddle链接!这是吗要使用大量的CPU/Ram吗?有没有更有效的方法来实现这一点的想法?不幸的是,我不能