2011-07-05 27 views
0

でGROUP BYを使用して、この配列を返す私のSQLで、私はGROUP BYを追加した場合こんにちは、私はしかしuksort()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 
     ) 

) 

を通過させた後、このようになります配列を持っているが、最終的にCOMPANY_NAME配列。消えるのエントリ、私は何を達成しようとしていますが、会社名の下に役職を置くことですが、一度だけ、会社名を表示し、これに似たような、

会社名1
職種1 職種2 職種3

会社名2
職種4

会社名
役職5職種6

私が行うことで、これを実現しようとしています私の見解では、しかし、私は1つの空室を表示することができますが、私は間違って何ですか?

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

@glass robot私の編集したコードをご覧ください。 – 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をループする方がはるかに簡単です:あなたはこのような何かを与える値として、ネストされた配列のキーとその会社の仕事として、会社名、配列と表示:

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

このソリューションははるかに簡単だとは思いませんが、もちろん別のアプローチでも使用できます。 – manRo

+0

@Tim Fountain - 私はキスできました! – Udders

0

あなたの配列が正しくソートされていない、同じIDを持つ従業員が次々なければなりませんcompany_name

0

によってソートされなければならないとき、アレイは、あなたがこの配列のために、job_titleDESCでソートされているように見えますこの

usort($jobs, function($a, $b) { 
if($a['employee_id'] == $b['employee_id'] return 0; 
return ($a['employee_id'] < $b['employee_id']) ? 1 : -1; 
}) 

他の方法のようにメソッドをusort使用して、私はあなたの目的のために、より良い1は、このセクションのループ用のデータを準備するためにあるarray_walk使用することであると考えてください。下のメソッドは、テーブルから重複を削除し、プライマリ従業員レコードの1つのキーにある同じ従業員のすべての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

ありがとう!しかし、それは今、雇用主がそれの 'section'タグの外にある第二の仕事を出力しています。これは修正できますか? – Udders

+0

ノードが生成されたif文でエラーが発生した場合は、データに問題はありません。 – manRo

0

これは、SQLクエリを表示した場合に役立ちます。ただし、消える行は明らかにあなたが追加するGROUP BY company_nameに関連しています。

GROUP BY groupfieldを追加すると、同じgroupfieldのすべての行が1つの行に「崩壊」します。 company_logoのように、そのフィールドに依存する列は、通常、SELECTのリストにとどまります。 SUM()またはCOUNT()のような集計関数を使用するには、他のすべてを削除または変更する必要があります。

したがって、会社ごとにジョブ数を表示する場合は、COUNT(job_id)またはCOUNT(*)を使用します。

あなたの場合、2つの選択肢があります。

  • 最初のオプションはGROUP BY、おそらく唯一ORDER BYを使用して、必要なものを示すためにPHPコードを使用しないことです。

  • 第2の選択肢は、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