如何解决:array_push似乎无法保存附加值

时间:2019-08-27 12:00:47

标签: php arrays multidimensional-array push

我正在从数据库中加载电报机器人的用户信息。我获取了聊天对象,汽车号码和计时器值。

创建一个数组,以将不同的汽车与用户一起容纳。

随后,我检查每个数据库结果/用户是否在阵列中存在他们的汽车。如果不是,则将新阵列推入该阵列。如果有汽车,则将当前用户作为一个数组添加到用户数组中。

但是,这似乎不起作用。 注意:要检查值是否存在于数组中,我使用了一个单独的函数,因为in_array不适用于多重暗淡。该功能已经过测试并且可以正常工作。

foreach循环中的第一个回声输出一个数组,其中显示了所有用户。超出循环范围时,第二张打印仅显示原始用户。

数据库中当前有两个用户注册了同一辆车。

$sql = 'SELECT chatid, car, timer FROM telegram_users WHERE car IS NOT NULL';
    $result = $connection->query($sql);
    $array = [];
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            if ($row['timer'] != NULL) {
                if (!in_array_r($row['car'], $array)) {
                    array_push($array, ['car' => $row['car'], 'users' => [['user' => $row['chatid'], 'timer' => $row['timer']]], 'hunt' => '']);
                } else {
                    foreach ($array as $element) {
                        if ($element['car'] == $row['car']) {
                            array_push($element['users'], ['user' => $row['chatid'], 'timer' => $row['timer']]);
                        }
                        echo print_r($element, true);
                    }
                    echo print_r($array, true);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您在foreach中的代码仅将值压入$ element变量。没有放入原始的$ array变量中。要修改原始的$ array变量,您有2个选项。

1)通过引用在foreach中分配值

foreach ($array as &$element) {
    if ($element['car'] == $row['car']) {
        array_push($element['users'], ['user' => $row['chatid'], 'timer' => $row['timer']]);
    }
    echo print_r($element, true);
}

确保在foreach的$ element前面添加&。这样您就可以编辑原始的$ array。 有关foreach和引用see php manual的更多信息。

2)您可以使用索引并将其直接推送到$ array变量

foreach ($array as $index => $element) {
    if ($element['car'] == $row['car']) {
        array_push($array[$index]['users'], ['user' => $row['chatid'], 'timer' => $row['timer']]);
    }
}

优化建议

您可以使用$ row ['car']的值索引数组。这样,检查它是否已经存在并推送新值将更快。

$array = [];
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        if ($row['timer'] != NULL) {
            if (!array_key_exists($row['car'], $array)) {
                $array[$row['car']] = [
                    'car' => $row['car'],
                    'users' => [
                        ['user' => $row['chatid'], 'timer' => $row['timer']]
                    ],
                    'hunt' => ''
                ];
            } else {
                array_push(
                    $array[$row['car']]['users'],
                    ['user' => $row['chatid'], 'timer' => $row['timer']]
                );
            }
        }
    }
    echo print_r($array, true);
}