Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用php为foreach编写代码的最佳实践->;foreach->;如果(第一个循环id==第二个循环id)->;结果_Php_Mysql_Foreach - Fatal编程技术网

用php为foreach编写代码的最佳实践->;foreach->;如果(第一个循环id==第二个循环id)->;结果

用php为foreach编写代码的最佳实践->;foreach->;如果(第一个循环id==第二个循环id)->;结果,php,mysql,foreach,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 我得到了正确的结果,但我认为有更好的方法来写这篇文章。您可以在表中使用连接。Left join意味着用户行必须存在(因为:Left),并且shifts enty是可选的 SELECT

第一循环表

user_id | fname | lname 1 | first | emp 2 | second| emp 3 | third | emp shift_id | employee_id 1 | 1 2 | 2 3 | 2
我得到了正确的结果,但我认为有更好的方法来写这篇文章。

您可以在表中使用连接。Left join意味着用户行必须存在(因为:Left),并且shifts 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快


请注意,这个问题可能有点不对劲,我只是在脑海里写下了这个问题。

你也可以这样做。稍微短一点

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

只是一些测试代码,我从为这个“演示代码”提供的信息中快速生成来测试它

注意:我对数据库使用了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>';
            }
        }
    }
}
案例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); 
(别问我为什么我喜欢在表名中使用非常缩写的别名!这只是“一件事”。)

然后你的“循环”就变成了

echo '<h2>Using foreach on join</h2>';
foreach ($employees as $employee) {
    echo ucwords($employee['fname'] . ' ' . $employee['lname']);
    echo '<br>';
}
案例2-减少了代码,只需要一次数据库访问


这对您有帮助吗?

您的代码中只有一个循环。您可以使用连接查询您可以在数据库端编写连接。它将只获取与您的条件匹配的记录。不需要创建任何循环。您当前的数据库查询是如何填充$employees的?对于查询来说,加入查询不是更好的建议,因为这将对数据库造成压力。你做得对,但我有兴趣知道你用单圈做了什么?
$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); 
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