1

私のウェブサイトでは、ユーザーは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)

ar上記の配列は、さまざまな言語での検索''に一致する6つのプロファイルがあることを示しています。上記の配列は次のように述べています。

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

ここで結果を表示したいのですが、実際のところ、結果に示されているように、両方の言語と言語arでID = 20のユーザーの''に一致するものがありますが、2を表示することはできません。同じ人の結果!したがって、腋窩の結果を手放す必要があるため、上記の配列は、ユーザーIDと言語の優先度に基づいてフィルタリングおよび一意化する必要があります。言語の優先度は、次のとおりです。EnglishFarsi

  1. $ _SESSION ['my_lang'];
  2. 英語(en);
  3. Rand();

ar検索クエリとして''を入力した人は、を持っている$_SESSION['my_lang']ので、結果を持っているユーザーの結果配列に、その結​​果$_SESSION['my_lang']を保持し、同じ人の他の一致を手放す必要があります。

その後$_SESSION['my_lang']、優先順位はEN langになります。ある人が、N言語の結果を持っているが、で一致するものが見つからなかった場合は$_SESSION['my_lang']、結果をen langに保持し、その人の残りの結果をクリアする必要があります。

上記の優先順位の後、実際には何も重要ではありません。その人の結果の1つを保持し、その人の他の結果を取り除く必要があるため、言語はランダムに選択する必要があります...

これをどのように達成できるかわかりません。どんな種類の助けもいただければ幸いです。


私の例では、次のような配列があります。

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'));

コードが機能するように、配列を配列のようにするにはどうすればよいですか。ありがとう

4

1 に答える 1

1

これを行うにはおそらくより良い(より効率的な)方法がありますが、ここに1つの方法があります。3つのステップでそれを行います。(1)言語配列を作成し、(2)言語配列に基づいてユーザー配列を順序付け、(3)ユーザー配列に一意のユーザーを持たせます。

ステップ2は無名関数を利用するため、PHP v <5.3の場合は、2番目のステップ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'];
}

ステップ2phpv>=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']];
});

ステップ2phpv<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);

phpFiddlew/ステップ2forphp v> = 5.3- http://phpfiddle.org/main/code/xva-dzn

phpFiddlew/ステップ2-phpv<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'
于 2013-01-03T00:36:49.350 に答える