我正在从数据库中加载电报机器人的用户信息。我获取了聊天对象,汽车号码和计时器值。
创建一个数组,以将不同的汽车与用户一起容纳。
随后,我检查每个数据库结果/用户是否在阵列中存在他们的汽车。如果不是,则将新阵列推入该阵列。如果有汽车,则将当前用户作为一个数组添加到用户数组中。
但是,这似乎不起作用。 注意:要检查值是否存在于数组中,我使用了一个单独的函数,因为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);
}
}
}
}
答案 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);
}