您好,我通过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']);
}
答案 0 :(得分:1)
虽然可以使用您的方法显示数据,但我通常会发现以更方便的格式创建第二个数组要简单得多:
$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 />';
}
}
答案 1 :(得分:0)
当job_title
DESC
company_name
排序
答案 2 :(得分:0)
您的数组排序不正确,具有相同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
}
});
答案 3 :(得分:0)
如果您显示SQL查询,将会有所帮助。但是,消失的行显然与您添加的GROUP BY company_name
相关。
当您添加GROUP BY groupfield
时,所有具有相同groupfield
“折叠”的行都会排成一行。依赖于该字段的列(例如company_logo
)通常可以安全地保留在SELECT
列表中。应删除或更改所有其他内容以使用SUM()
或COUNT()
等汇总函数。
因此,如果您想显示每家公司的工作数量,请使用COUNT(job_id)
或COUNT(*)
。
在你的情况下,我认为你有两个选择。
第一个选项是不使用GROUP BY
,也许只使用ORDER BY
并使用PHP代码来显示您需要的内容。
第二个选项是使用GROUP BY
和汇总GROUP_CONCAT()
功能。
您可以像以下一样使用它:
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