在foreach中编写代码的最佳实践 - > foreach-> if(1st loop id == 2nd loop id) - > result

时间:2018-01-03 08:06:02

标签: php mysql foreach

第一个循环表

user_id | fname | lname
1       | first | emp
2       | second| emp
3       | third | emp

第二个循环表

shift_id | employee_id
1        | 1
2        | 2
3        | 2
if($employees)
{
  foreach ($employees as $employee) 
  {
    if($employee['user_id'] == $shift['employee_id'])
    {
      echo ucwords($employee['fname']. ' ' .$employee['lname']);
    }
  }
}

我得到了正确的结果,但我认为有更好的方式来写这个。

3 个答案:

答案 0 :(得分:3)

您可以在表格中使用联接。左连接意味着用户行必须存在(因为:LEFT),并且移位enty是可选的。

SELECT user.user_id, user.fname, user.lname, shifts.shift_id
FROM yourUserTable AS user
LEFT JOIN yourShiftsTable AS shifts ON(user.user_id = shifts.employee_id)

现在你在初始数组中得到它,好像你将它从表中选为一行,不再需要在PHP中使用技巧来组合信息。如果可以,总是尝试让数据库来管理数据,它可以比PHP更快地实现方式

请注意,查询可能有点偏差,我只是把它写成了我的头脑。

答案 1 :(得分:1)

我只是根据为此提供的信息测试了一些测试代码"演示代码"。

注意:我已经将mysqli类用于数据库(实例化$ db)并排除了SQL表设置。

你所拥有的东西就是这个......

案例1 - 原始

$db = new mysqli('localhost', 'root', 'test', 'phptutorials_st26');

echo '<h2>Create $employees </h2>';
$query = "SELECT * FROM users";
$result = $db->query($query);
$employees = $result->fetch_all(MYSQL_ASSOC);
var_dump($employees);


echo '<h2>Create $shifts </h2>';
$query = "SELECT * FROM shifts";
$result = $db->query($query);
$shifts = $result->fetch_all(MYSQL_ASSOC);
var_dump($shifts);


echo '<h2>Using foreach on $employees and $shifts</h2>';

if ($employees) {
    foreach ($employees as $employee) {
        foreach ($shifts as $shift) {
            if ($employee['user_id'] == $shift['employee_id']) {
                echo ucwords($employee['fname'] . ' ' . $employee['lname']);
                echo '<br>';
            }
        }
    }
}

以上结果是

First Emp
Second Emp
Second Emp

案例2 - 使用加入

正如大家已经说过的那样,使用联接是可行的方式......

$sql = "SELECT u.user_id, u.fname, u.lname, s.shift_id
          FROM users AS u
             JOIN shifts AS s ON(u.user_id = s.employee_id)
       ";

$result = $db->query($sql);
$employees = $result->fetch_all(MYSQL_ASSOC);

// To see what comes out because we always check things.
var_dump($joined_result); 

(不要问我为什么喜欢在表名中使用非常简短的别名!它只是&#34;一件事&#34;。)

然后你的&#34;循环&#34;简单地变成......

echo '<h2>Using foreach on join</h2>';
foreach ($employees as $employee) {
    echo ucwords($employee['fname'] . ' ' . $employee['lname']);
    echo '<br>';
}

结果是......

First Emp
Second Emp
Second Emp

案例2 - 减少了代码,只需要1次数据库访问。

这对你有帮助吗?

答案 2 :(得分:0)

你也可以这样做。它有点短。

SELECT TABLE1.FNAME, TABLE1.LNAME, TABLE2.EMPLOYEE_ID 
FROM TABLE1, TABLE2 
WHERE TABLE1.USER_ID = TABLE2.EMPLOYEE_ID;