array_combine 字符串中有两个以上的值
Posted
技术标签:
【中文标题】array_combine 字符串中有两个以上的值【英文标题】:More than two values in array_combine string 【发布时间】:2018-04-05 06:02:47 【问题描述】:我试图在我的 array_combine 函数中添加一个额外的数组,当添加了两个以上的值时出现以下错误:
[24-Oct-2017 12:18:18 UTC] php 警告:在第 61 行的 /manage/add-users-to-courses.php 中为 foreach() 提供的参数无效
我的工作代码:
$stmtcd = "SELECT id, course_title FROM distributor_course_settings WHERE distributor = ? AND active = 'Y' AND price NOT LIKE '0.00'";
$stmtcd = $conn->prepare($stmtcd);
$stmtcd->bind_param('s', $distributor);
$stmtcd->execute();
$stmtcd->bind_result($id, $course_title);
while($stmtcd->fetch())
$course_id_array[] = $id;
$course_title_array[] = $course_title;
<?php
foreach (array_combine($course_id_array, $course_title_array) as $course_id => $course_title)
echo '<tr style="background: #dddddd;">';
echo '<td><h2 style="text-align: center; margin: 0;">' . $course_title . ' - ' . $price . '</h2></td>';
echo '</tr>';
foreach (array_combine($user_id_array, $username_array) as $user_id => $username)
echo '<tr>';
echo '<td><input type="checkbox" id="" name="" value="' . $course_id . ',' . $course_title . ',' . $price . ',' . $user_id . ',' . $username . '"> ' . $username . '</td>';
echo '</tr>';
?>
每当我尝试将“价格”添加到 SELECT 语句以及 for each 语句中时,都会出现上述错误。
这是为什么? foreach/array_combine 中允许的值是否有限制?
【问题讨论】:
var_dump(array_combine($course_id_array, $course_title_array))
- 你得到了什么?
这看起来是一种非常低效的方式来存储您从数据库中获得的信息。为什么不将完整的行存储在结果数组中?
@jeroen 这是我知道的唯一方法,所以现在必须这样做。
所以这可能意味着没有匹配的行,这些数组根本没有被创建,你正在尝试组合两个 null
值,你应该会看到一个警告。跨度>
错误日志显示:array_combine() 需要 2 个参数,3 个给定 ...
【参考方案1】:
遵循良好的编码标准和best practices
虽然“最佳实践”范围广泛,数量众多,并且充满了不同的意见,但它们很重要并且通常都同意。在您的情况下,您应该 initialize variables(参见示例 1)。
PHP array_combine 需要数组
array_combine 要求所有参数都是数组。因此,将这些变量初始化为空数组。
$course_id_array = [];
$course_title_array = [];
$user_id_array = [];
$username_array = [];
while($stmtcd->fetch())
$course_id_array[] = $id;
$course_title_array[] = $course_title;
不要破坏您的数据。
在您的代码中,您将数据的ID
和数据分开到不同的数组中,只是为了循环它们而再次组合它们。开始时正确创建数组,您的代码将更加更简洁。
$courses = [];
while($stmtcd->fetch())
$courses[$id] = $course_title;
foreach($courses as $course_id => $course_title)
// your code here
使用物品让生活更轻松
虽然一开始构建所有程序都比较简单,但 OOP 会让生活变得更轻松。
// build an object for your Course
Class Course
public $id, $title, $price;
public function __construct($title, $id = 0)
$this->id = $id;
$this->title = $title;
// Build an object for your db conn and queries
// Note: in a larger app, DB conn, and specific SQL commands, should be built in different objects, Like:
// $dbo = new DBO($conn);
// $courseTools = new CourseDBTools($dbo);
// $course = $courseTools->getOneMatchingCourse([args]);
Class DBO
private $conn;
public function __construct($conn)
$this->conn = $conn;
public function getCoursesByDistrubutor($distributor)
$title = '';
$id = 0;
$price = 99;
$stmtcd = "SELECT id, course_title, price FROM distributor_course_settings WHERE distributor = ? AND active = 'Y' AND price NOT LIKE '0.00'";
$stmtcd = $this->conn->prepare($stmtcd);
$stmtcd->bind_param('s', $distributor);
$stmtcd->execute();
$stmtcd->bind_result($id, $title, $price);
while($stmtcd->fetch())
$course = new Course($title, $id);
$course->price = $price;
yield $course;
// Then your actual code becomes clean and simple
$distributor = 'ABC';
$conn = null; //set it,
$dbo = new DBO($conn);
foreach ($dbo->getCoursesByDistrubutor($distributor) as $course)
echo $course->title . ' - ' . $course->price;
【讨论】:
【参考方案2】:保持简单。把这两个循环改成这两个:
while($stmtcd->fetch())
$titles[$id] = $course_title;
foreach ($titles as $course_id => $course_title) ...
如果您以后只需要 id 或只需要标题(没有 id),请参阅 array_keys($title)
和 array_values($titles)
。
【讨论】:
以上是关于array_combine 字符串中有两个以上的值的主要内容,如果未能解决你的问题,请参考以下文章