uksort帮助 - 在单一需求帮助中使用GROUP BY

时间:2011-07-05 21:30:09

标签: php mysql arrays codeigniter foreach

您好,我通过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']);
    }

4 个答案:

答案 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