[英]uksort help - using GROUP BY in single need help
你好,我有一個數組,通過uksort()
后看起來像這樣
Array
(
[3] => Array
(
[job_id] => 4
[job_title] => Supercar Test Driver
[company_name] => McLaren
[logo_small] => small_mclaren001.png
[logo_large] => large_mclaren002.png
[employer_id] => 3
)
[2] => Array
(
[job_id] => 3
[job_title] => Recruitment Consultant - Driving
[company_name] => MoovJob.com
[logo_small] => small_rac001.png
[logo_large] => large_rac002.png
[employer_id] => 2
)
[1] => Array
(
[job_id] => 5
[job_title] => Postal Worker / Post Person
[company_name] => Royal Mail
[logo_small] => small_royalmail001.png
[logo_large] => large_royalmail002.png
[employer_id] => 4
)
[0] => Array
(
[job_id] => 6
[job_title] => Another Job
[company_name] => MoovJob.com
[logo_small] => small_rac001.png
[logo_large] => large_rac002.png
[employer_id] => 2
)
)
但是,如果在返回此數組的 SQL 中,我添加 GROUP BY company_name 數組中的最終條目消失,我想要實現的是將職位名稱放在公司名稱下,但只顯示公司名稱一次,類似於這個,
公司名稱 1
職稱 1 職稱 2 職稱 3公司名稱 2
職稱 4公司名稱
職位名稱 5 職位名稱 6
我試圖通過在我看來執行以下操作來實現這一點,但是我只能顯示一個空缺,我做錯了什么?
<?php $oldemp = "";?>
<?php foreach($jobs as $key => $value) : ?>
<?php if ($oldemp != $value['company_name']) : ?>
<?php $oldemp = $value['company_name']; ?>
<section class="employer">
<div class="job_holder">
<img src="<?php echo base_url(); ?>media/uploads/users/<?php echo $value['logo_large']; ?>" width="198" height="148" alt="<?php echo $value['company_name']; ?>"/>
<dl>
<dt><?php echo count($key); ?></dt>
<dd>Matches</dd>
</dl>
<?php endif;?>
<span> + <a href="/jobwall/getjob/<?php echo $value['job_id']; ?>"><?php echo $value['job_title']; ?></a></span>
</div>
</section>
<?php endforeach; ?>
function jobcmp($job1, $job2)
{
return strcmp($job1['company_name'], $job2['company_name']);
}
盡管可以使用您的方法顯示數據,但我通常發現以更方便的格式創建第二個數組要簡單得多:
$groupedJobs = array();
foreach ($jobs as $data) {
if (!isset($groupedJobs[$data['company_name']])) {
$groupedJobs[$data['company_name']] = array();
}
$groupedJobs[$data['company_name']][] = $data;
}
這將使用公司名稱作為鍵創建一個新數組,並將嵌套數組中該公司的工作作為值,為您提供如下內容:
['MoovJob.com'] => Array
(
[0] => Array
(
(job data)
),
[1] => Array
(
(etc.)
)
),
['McLaren'] = Array
(
(etc)
)
然后更容易遍歷這個數組並顯示:
foreach ($groupedJobs as $companyName => $jobs) {
echo $companyName;
foreach ($jobs as $job) {
echo $job['job_title'].'<br />';
}
}
看起來數組是按job_title
DESC
排序的,而它應該按company_name
排序
您的數組未正確排序,具有相同 id 的員工應該是一個接一個,對於這個數組,您應該使用這樣的 usort 方法
usort($jobs, function($a, $b) {
if($a['employee_id'] == $b['employee_id'] return 0;
return ($a['employee_id'] < $b['employee_id']) ? 1 : -1;
})
另一種方法,我認為更適合您的目的是使用 array_walk 為本節循環准備數據。 下面的方法將從表中刪除重復項,並將同一員工的所有 job_titles 連接到主要員工記錄中的一個鍵中。
array_walk($jobs, function($emp, $index) use(&jobs) {
static $primary;
if(isset($primary[$emp['employee_id']) {
$jobs[$primary[$emp['employee_id']]]['job_titles'][$emp['job_id'] = $emp['job_title'];
unset($jobs[$index]);
} else {
$primary[$emp['employee_id']] = $index; //remeber index of primary entry
}
});
如果您顯示 SQL 查詢,將會有所幫助。 但是,消失的行顯然與您添加的GROUP BY company_name
有關。
當您添加GROUP BY groupfield
時,具有相同groupfield
的所有行“折疊”成一行。 依賴於該字段的列,如company_logo
通常可以安全地保留在SELECT
列表中。 所有其他人都應刪除或更改為使用聚合 function ,如SUM()
或COUNT()
。
因此,如果您想顯示每家公司的職位數量,請使用COUNT(job_id)
或COUNT(*)
。
就您而言,我認為您有兩種選擇。
第一個選項是不使用GROUP BY
,也許只使用ORDER BY
並使用 PHP 代碼來顯示您需要的內容。
第二個選項是使用GROUP BY
和聚合GROUP_CONCAT()
function。
你可以像這樣使用它:
SELECT
company_name
, GROUP_CONCAT( job_id
ORDER BY job_id
SEPARATOR ', ' )
AS job_ids
, GROUP_CONCAT( job_title
ORDER BY job_id
SEPARATOR ', ' )
AS job_titles
, GROUP_CONCAT( CONCAT(job_id, '-', job_title)
ORDER BY job_id
SEPARATOR ', ' )
AS job_ids_and_titles
, company_name
, logo_small
, logo_large
, employer_id
FROM
...
GROUP BY company_name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.