用户随机配对

时间:2017-12-29 19:46:26

标签: php laravel

我从用户表中使用随机函数获取了所有用户记录, 现在,当我循环用户并尝试显示时,

我需要这样的记录:

user a = user b
user c = user a
user b = user c

我不能这样:

user a = user a
user b = user b

以下是我的代码

public function randomUser(){
    $userData1   = User::inRandomOrder()->orderBy('email', 'ASC')->get();
    $userData2   = User::inRandomOrder()->orderBy('id', 'DESC')->get();
    foreach($userData1 as $key => $value ) {
        if($userData1[$key]->id != $userData2[$key]->id){
            echo $userData1[$key]->first_name.$userData1[$key]->last_name."-".$userData2[$key]->first_name.$userData2[$key]->last_name."<br>";
        }
    }
}

2 个答案:

答案 0 :(得分:1)

inRandomOrder()超级慢,所以你可能不想使用它。 您应该在没有orderBy的情况下通过简单查询从DB中选择一次数据。

  • 对于单维数组:

将结果用户数组分为两个变量。

$a = $b = ['user a','user b','user c'];

随机

的随机数组 $ a
shuffle($a);

将其循环到 do-while 循环中 随机数组 $ b 并比较 $ a&amp; $ b 数组索引&amp;值

do{
    shuffle($b);
    $c = array_diff_assoc($a, $b);
}while(count($c)!=count($a));
  • 对于多维数组:

将结果用户数组分为两个变量。

$a = $b = [array('id' => 1, 'name' => "abc"),array('id' => 2, 'name' => "def"),array('id' => 3, 'name' => "ghi")];

随机

的随机数组 $ a
shuffle($a);

比较多维数组的函数

function arrayRecursiveDiff($aArray1, $aArray2) { 
    $aReturn = array(); 

    foreach ($aArray1 as $mKey => $mValue) { 
        if (array_key_exists($mKey, $aArray2)) { 
            if (is_array($mValue)) { 
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]); 
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; } 
            } else { 
                if ($mValue != $aArray2[$mKey]) { 
                    $aReturn[$mKey] = $mValue; 
                } 
            } 
        } else { 
            $aReturn[$mKey] = $mValue; 
        } 
    }
    return $aReturn; 
} 

将其循环到 do-while 循环中 随机数组 $ b 并比较 $ a&amp; $ b 数组索引&amp;值

do{
    shuffle($b);
    $c = arrayRecursiveDiff($a, $b);
}while(count($c)!=count($a));

两个阵列彼此完全不同。现在你可以用这两个数组做任何事情了。

答案 1 :(得分:0)

你需要在这里使用某种算法。例如,您可以将所有用户都放入集合中。然后,使用shift()和/或pop()方法从集合中获取并删除每个用户。这是一个示例,可以根据需要进行修改:

$users1 = User::inRandomOrder()->get();
$users2 = $users1;
foreach ($users1 as $user) {
    echo $user->full_name. ' - '. $users2->pop()->full-name;
}

另外,要使full_name正常工作,请使用accessor,而不是每次手动连接两个字符串。