在 PHP 中获得一定数量的结果后,是否可以从 foreach 循环内的其他表中获取数据?
Is it possible to fetch data from other tables inside a foreach loop after a certain amount of results in PHP?
我很期待知道这是否可能。假设我想要的是,我有一个包含 10 行的 table_1,我还有另外两个表,每个表有 2 行。现在,我的 foreach 循环从 table_1 获取 10 行,但在每第二行之后我想显示来自 table_2 的一行,在第四行之后我想显示来自 table_3 的一行。我将如何实现这一目标?
请看附图。
PHP 方法
假设您的数据如下所示:
$table1 = [
'Row 1 from table_1',
'Row 2 from table_1',
'Row 3 from table_1',
'Row 4 from table_1',
'Row 5 from table_1',
'Row 6 from table_1',
'Row 7 from table_1',
'Row 8 from table_1',
'Row 9 from table_1',
'Row 10 from table_1',
];
$table2 = [
'Row 1 from table_2',
'Row 2 from table_2'
];
$table3 = [
'Row 1 from table_3',
'Row 2 from table_3'
];
解决此问题的一种方法是执行循环并参考索引号,以决定是否根据模数运算符(即余数)从其他 table 中的一个追加数组元素除法时)。
编写这种逻辑的一种方法如下:
$out = [];
foreach($table1 as $k=>$v)
{
$out[] = $v;
if( $k % 4 === 1 && count($table2) > 0)
{
$out[] = array_shift($table2);
}
if( $k % 4 === 3 && count($table3) > 0)
{
$out[] = array_shift($table3);
}
}
print_r($out);
对我来说,上面给出了一个输出,据我所知这是你想要的输出:
Array
(
[0] => Row 1 from table_1
[1] => Row 2 from table_1
[2] => Row 1 from table_2
[3] => Row 3 from table_1
[4] => Row 4 from table_1
[5] => Row 1 from table_3
[6] => Row 5 from table_1
[7] => Row 6 from table_1
[8] => Row 2 from table_2
[9] => Row 7 from table_1
[10] => Row 8 from table_1
[11] => Row 2 from table_3
[12] => Row 9 from table_1
[13] => Row 10 from table_1
)
旁注:array_shift 将破坏 table2 和 table3 的数组。如果这是一个不需要的副作用,可以尝试稍微修改一下代码,例如先克隆数组。
Mysql 方法
或者,您也可以在 mysql 级别解决此问题。基本上,您可以通过联合或连接将 table 连接在一起。然后你需要一种方法来以特殊的方式对它进行排序。这样做的一个好方法是动态引入一个新列,它代表某种基于主键的计算。
假设您的 table 看起来像这样:
CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO `table1` VALUES (1,'Row 1 from table_1'),(2,'Row 2 from table_1'),
(3,'Row 3 from table_1'),(4,'Row 4 from table_1'),
(5,'Row 5 from table_1'),(6,'Row 6 from table_1'),
(7,'Row 7 from table_1'),(8,'Row 8 from table_1'),
(9,'Row 9 from table_1'),(10,'Row 10 from table_1');
CREATE TABLE `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `table2` VALUES (1,'Row 1 from table_2'),(2,'Row 2 from table_2');
CREATE TABLE `table3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `table3` VALUES (1,'Row 1 from table_3'),(2,'Row 2 from table_3');
您可以使用如下查询:
SELECT data FROM (SELECT (id + floor((id - 1) / 2)) AS order_id, data FROM table1
UNION
SELECT ( (6 * (id-1)) +3) AS order_id, data FROM table2
UNION
SELECT ( (6 * (id-1)) +6) AS order_id, data FROM table3) t4
ORDER BY order_id;
这里的逻辑基本上是因为 table 具有相同的结构,我们可以将它们的结果联合在一起。然后基本上我们希望 table 一个有这样的排序索引:
1,2, 4,5, 7,8, 10,11, 13,14.
通过这样做,我们为每个第 3 个索引留出空间,以便能够指向其他内容。
至于间隙,我们希望 3、6、9 和 12 指向其他两个 table。 3和9应该指向table两个。 6 和 12 应该指向 table 三。然后我们根据主键和 table 做一些数学运算,得到一个唯一的 order_id。然后按 order_id.
排序
结果:
Row 1 from table_1
Row 2 from table_1
Row 1 from table_2
Row 3 from table_1
Row 4 from table_1
Row 1 from table_3
Row 5 from table_1
Row 6 from table_1
Row 2 from table_2
Row 7 from table_1
Row 8 from table_1
Row 2 from table_3
Row 9 from table_1
Row 10 from table_1
我很期待知道这是否可能。假设我想要的是,我有一个包含 10 行的 table_1,我还有另外两个表,每个表有 2 行。现在,我的 foreach 循环从 table_1 获取 10 行,但在每第二行之后我想显示来自 table_2 的一行,在第四行之后我想显示来自 table_3 的一行。我将如何实现这一目标?
请看附图。
PHP 方法
假设您的数据如下所示:
$table1 = [
'Row 1 from table_1',
'Row 2 from table_1',
'Row 3 from table_1',
'Row 4 from table_1',
'Row 5 from table_1',
'Row 6 from table_1',
'Row 7 from table_1',
'Row 8 from table_1',
'Row 9 from table_1',
'Row 10 from table_1',
];
$table2 = [
'Row 1 from table_2',
'Row 2 from table_2'
];
$table3 = [
'Row 1 from table_3',
'Row 2 from table_3'
];
解决此问题的一种方法是执行循环并参考索引号,以决定是否根据模数运算符(即余数)从其他 table 中的一个追加数组元素除法时)。
编写这种逻辑的一种方法如下:
$out = [];
foreach($table1 as $k=>$v)
{
$out[] = $v;
if( $k % 4 === 1 && count($table2) > 0)
{
$out[] = array_shift($table2);
}
if( $k % 4 === 3 && count($table3) > 0)
{
$out[] = array_shift($table3);
}
}
print_r($out);
对我来说,上面给出了一个输出,据我所知这是你想要的输出:
Array
(
[0] => Row 1 from table_1
[1] => Row 2 from table_1
[2] => Row 1 from table_2
[3] => Row 3 from table_1
[4] => Row 4 from table_1
[5] => Row 1 from table_3
[6] => Row 5 from table_1
[7] => Row 6 from table_1
[8] => Row 2 from table_2
[9] => Row 7 from table_1
[10] => Row 8 from table_1
[11] => Row 2 from table_3
[12] => Row 9 from table_1
[13] => Row 10 from table_1
)
旁注:array_shift 将破坏 table2 和 table3 的数组。如果这是一个不需要的副作用,可以尝试稍微修改一下代码,例如先克隆数组。
Mysql 方法
或者,您也可以在 mysql 级别解决此问题。基本上,您可以通过联合或连接将 table 连接在一起。然后你需要一种方法来以特殊的方式对它进行排序。这样做的一个好方法是动态引入一个新列,它代表某种基于主键的计算。
假设您的 table 看起来像这样:
CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO `table1` VALUES (1,'Row 1 from table_1'),(2,'Row 2 from table_1'),
(3,'Row 3 from table_1'),(4,'Row 4 from table_1'),
(5,'Row 5 from table_1'),(6,'Row 6 from table_1'),
(7,'Row 7 from table_1'),(8,'Row 8 from table_1'),
(9,'Row 9 from table_1'),(10,'Row 10 from table_1');
CREATE TABLE `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `table2` VALUES (1,'Row 1 from table_2'),(2,'Row 2 from table_2');
CREATE TABLE `table3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `table3` VALUES (1,'Row 1 from table_3'),(2,'Row 2 from table_3');
您可以使用如下查询:
SELECT data FROM (SELECT (id + floor((id - 1) / 2)) AS order_id, data FROM table1
UNION
SELECT ( (6 * (id-1)) +3) AS order_id, data FROM table2
UNION
SELECT ( (6 * (id-1)) +6) AS order_id, data FROM table3) t4
ORDER BY order_id;
这里的逻辑基本上是因为 table 具有相同的结构,我们可以将它们的结果联合在一起。然后基本上我们希望 table 一个有这样的排序索引:
1,2, 4,5, 7,8, 10,11, 13,14.
通过这样做,我们为每个第 3 个索引留出空间,以便能够指向其他内容。
至于间隙,我们希望 3、6、9 和 12 指向其他两个 table。 3和9应该指向table两个。 6 和 12 应该指向 table 三。然后我们根据主键和 table 做一些数学运算,得到一个唯一的 order_id。然后按 order_id.
结果:
Row 1 from table_1
Row 2 from table_1
Row 1 from table_2
Row 3 from table_1
Row 4 from table_1
Row 1 from table_3
Row 5 from table_1
Row 6 from table_1
Row 2 from table_2
Row 7 from table_1
Row 8 from table_1
Row 2 from table_3
Row 9 from table_1
Row 10 from table_1