【问题标题】:Is it possible to fetch data from other tables inside a foreach loop after a certain amount of results in PHP?在 PHP 中获得一定数量的结果后,是否可以从 foreach 循环中的其他表中获取数据?
【发布时间】:2022-01-05 06:09:48
【问题描述】:

我期待知道这是否可能。我想要的是,假设我有一个 table_1 有 10 行,我还有另外两个表,每个有 2 行。现在,我的 foreach 循环从 table_1 获取 10 行,但是在每 2 行之后我想从 table_2 显示一行,在第 4 行之后我想从 table_3 显示一行。我将如何实现这一目标?

请看附图。

【问题讨论】:

  • 有可能;它可能只涉及一些UNIONs;但是您的“示例”含糊不清,无法用作示例。这些表不会每个只有 10/2/2 条记录,您如何确定要从每个表中使用哪些记录,这些表是否具有相同的列,如果其中一个没有足够的记录怎么办,这将如何影响结果等。您必须显示您的 CREATE TABLE 语句。另外,如果它们或多或少相同,为什么会有 3 个单独的表?它给人的印象是你可能只想要一个带有额外枚举列的表,...
  • 从表面上看问题,运行三个查询以创建三个结果集,然后遍历行,每六行来自表 3,每第三行来自表 2,以及其他所有内容来自表 1。当每行的数字不符合模式时,您必须处理这种情况。
  • 谢谢你们。

标签: php mysql database loops foreach


【解决方案1】:

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

解决此问题的一种方法是执行循环并参考索引号,以根据模运算符(即除法时的余数)决定是否从其他表中附加一个数组元素。

编写此类逻辑的一种方法如下:

$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 级别解决此问题。基本上,您可以通过联合或联接将表格连接在一起。然后,您需要一种以特殊方式对其进行排序的方法。这样做的一个好方法是动态引入一个新列,该列表示基于主键的某种计算。

假设您的表格如下所示:

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;

这里的逻辑基本上是由于表具有相同的结构,我们可以将它们的结果联合在一起。然后基本上我们希望表一具有这样的排序索引:
1,2, 4,5, 7,8, 10,11, 13,14。

通过这样做,我们为每个第三个索引留出了空间,以便能够指向其他东西。
至于差距,我们希望 3、6、9 和 12 指向其他两张桌子。 3 和 9 应指向表 2。 6 和 12 应指向表 3。然后我们只是根据主键和表做一些数学运算,最后得到一个唯一的 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

【讨论】:

  • 各方面都很完美。非常感谢。
  • @Bearded 没问题!如果它提供了您需要的解决方案,请记住接受答案 =)
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 2015-09-18
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多