gpt4 book ai didi

php - 将 MySQL 结果集传输到数组时排序/乱序

转载 作者:行者123 更新时间:2023-11-29 06:55:31 27 4
gpt4 key购买 nike

我在 PHP 中遇到 MySQL 数据和数组的特殊问题。

背景:该系统是一种用于从调查系统导出数据的报告工具。用户可以多次响应任何调查。一项调查可以包含任意数量的问题。

每组回复都由 unique_uid 列标识,因此 10 个问题的 10 行都具有相同的 unique_uid(18-24 位数字字符串)。每个响应都作为一行存储在表 scores 中。用户可能在表 accounts 中有一个帐户,或者他们可能在没有注册的情况下以访客身份完成了调查。

我有两个要提取的查询:

(第一个)unique_uid 和帐户的 name_firstname_last(如果存在)的 DISTINCT 集合。如果用户在没有帐户的情况下响应,则它们是 NULL。结果按 name_last 升序排列,然后按 name_first 升序排列。所有 guest (NULL)都排在第一位,然后是所有有姓名的帐户。

(其次)查询以收集对调查的所有回复,然后将它们与它们的所有者配对。

问题: 由于某种原因,我的数组数据没有按照 MySQL 返回的顺序排列。我有两个或三个具有 name_firstname_last 的帐户,它们散布在 NULL 帐户中。

考虑到我按 name_last 然后 name_first 按升序排序,并且数据按该顺序从 MySQL 返回,并且 PHP 数组按该顺序生成,我无法找出它丢失顺序的原因。 PHP 是否根据最后触摸的键重新构造数组数据?

我想也许我的关联键被重铸为索引,所以我在每个 unique_uid 前加上字母“a”,但这没有帮助。

感谢您的任何见解,谢谢...

**编辑: 我能够使用 usort()(本文底部的代码)按顺序取回数据。但是仍然无法弄清楚为什么它首先出现故障:(

$rs = $wpdb->get_results( 'SELECT DISTINCT unique_uid, u.name_first, u.name_last FROM wp_fen_cme_scores s LEFT JOIN wp_fen_cme_accounts u ON u.uid = s.account_uid WHERE s.test_uid = ' . $y . ' ORDER BY u.name_last' );

// ** When I var_dump( $rs ), the data is in the correct order **
$userdata = array();
foreach ( $rs as $row ){
$userdata[ 'a' . $row->unique_uid ] = array( $row->name_first, $row->name_last, array() );
}

// ** When I var_dump( $userdata ), the data is no longer in the correct order **

$rs = $wpdb->get_results( 'SELECT s.unique_uid, s.question_uid, s.answer, s.correct, s.time, s.lost_focus_count, s.date_created, (q.correct_answer < 1 ) AS open FROM wp_fen_cme_scores s, wp_fen_cme_questions q WHERE s.test_uid = ' . $y . ' AND q.uid = s.question_uid ORDER BY q.sort ASC');
foreach ( $rs as $row ){
$userdata[ 'a' . $row->unique_uid ][2][ $row->question_uid ] = array( $row->answer, $row->correct, $row->time, $row->lost_focus_count, $row->open, $row->date_created );
}

top 查询的一些示例数据:

[..]
[46]=>
object(stdClass)#315 (3) {
["unique_uid"]=>
string(20) "20977191501349809722"
["name_first"]=>
NULL
["name_last"]=>
NULL
}
[47]=>
object(stdClass)#316 (3) {
["unique_uid"]=>
string(19) "6630155101349813205"
["name_first"]=>
NULL
["name_last"]=>
NULL
}
[48]=>
object(stdClass)#317 (3) {
["unique_uid"]=>
string(21) "982542341421349813493"
["name_first"]=>
string(14) "Patrick"
["name_last"]=>
string(15) "Moore"
}
[49]=>
object(stdClass)#318 (3) {
["unique_uid"]=>
string(19) "7589292181349812907"
["name_first"]=>
string(5) "Mallory"
["name_last"]=>
string(9) "Moore"
}
[..]

来自第二个查询的示例数据:

  [0]=>
object(stdClass)#262 (8) {
["unique_uid"]=>
string(20) "16079139101349813111"
["question_uid"]=>
string(2) "41"
["answer"]=>
string(13) "Health Center"
["correct"]=>
string(1) "1"
["time"]=>
string(3) "5.0"
["lost_focus_count"]=>
string(1) "1"
["date_created"]=>
string(19) "2012-10-09 16:05:18"
["open"]=>
string(1) "1"
}
[1]=>
object(stdClass)#261 (8) {
["unique_uid"]=>
string(19) "7491272021349813110"
["question_uid"]=>
string(2) "41"
["answer"]=>
string(28) "Community-Based Organization"
["correct"]=>
string(1) "1"
["time"]=>
string(3) "5.7"
["lost_focus_count"]=>
string(1) "0"
["date_created"]=>
string(19) "2012-10-09 16:05:17"
["open"]=>
string(1) "1"
}
[2]=>
object(stdClass)#260 (8) {
["unique_uid"]=>
string(20) "20879148791349813105"
["question_uid"]=>
string(2) "41"
["answer"]=>
string(13) "Health Center"
["correct"]=>
string(1) "1"
["time"]=>
string(3) "5.3"
["lost_focus_count"]=>
string(1) "1"
["date_created"]=>
string(19) "2012-10-09 16:05:13"
["open"]=>
string(1) "1"
}
[3]=>
object(stdClass)#259 (8) {
["unique_uid"]=>
string(19) "6630155101349813079"
["question_uid"]=>
string(2) "41"
["answer"]=>
string(22) "Other Clinical Setting"
["correct"]=>
string(1) "1"
["time"]=>
string(4) "18.4"
["lost_focus_count"]=>
string(1) "0"
["date_created"]=>
string(19) "2012-10-09 16:04:59"
["open"]=>
string(1) "1"
}
[..]

排序函数:

function custom_sort( $a, $b ){
// Compare on `name_last` (the second item in $userdata array)
return $a[1] > $b[1] ;
}
usort( $userdata, "custom_sort" );

最佳答案

这可能是因为您的 key 长度。

你可以做的是使键的长度相同,比如在前面加上零

// This will prepend zeros before the key and keep only the last
// 24 characters. If your key is 24 characters long it will be
// intact, otherwise it will end up with a few zeros at the front
$key = substr('00000' . $row->unique_uid, -24);

关于php - 将 MySQL 结果集传输到数组时排序/乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com