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 字符串中有两个以上的值的主要内容,如果未能解决你的问题,请参考以下文章

php array_combine()函数 语法

PHP使用array_combine和array_column

php函数 array_combine

深度解析PHP数组函数array_combine

在if语句中有两个foreach循环

PHP数组函数