2011-07-05 291 views
0

你好,我有一个数组,看起来像这样将其通过uksort()uksort帮助 - 在单需要使用GROUP BY帮助

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']); 
    } 
+1

这是一个很长的问题,有很多的细节。这意味着需要很多努力才能够理解核心问题,更不用说问题的具体细节。如果您能够在更简单的情况下重新创建问题,然后请求我们解决简单的情况,以便我们不必了解阵列的所有信息,那对我们和您都将有所帮助。 –

+0

你在'uksort'中使用了什么函数? –

+0

@玻璃机器人请看我编辑的代码。 – Udders

回答

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) 
    ) 

它是那么很多通过THI循环更容易s阵列和显示器:

foreach ($groupedJobs as $companyName => $jobs) { 
    echo $companyName; 
    foreach ($jobs as $job) { 
     echo $job['job_title'].'<br />'; 
    } 
} 
+0

我不认为这个解决方案会更直接,但当然它也可以使用不同的方法。 – manRo

+0

@蒂姆喷泉 - 我可以吻你! – Udders

0

它看起来像阵列由job_titleDESC排序时,它应该由company_name

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 
    } 
}); 
+0

谢谢!然而,它现在正在输出第二份工作,雇主已经在它的“部分”标签之外。这可以解决吗? – Udders

+0

这是没有问题的数据,如果你的if语句中有错误,生成

节点 – manRo

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