uksort help - использование GROUP BY в одиночной помощи - PullRequest
0 голосов
/ 06 июля 2011

Здравствуйте, у меня есть массив, который выглядит следующим образом после прохождения через 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 ]

1 голос
/ 06 июля 2011

Хотя было бы возможно отобразить данные, используя ваш подход, я обычно нахожу гораздо проще создать второй массив в более удобном формате:

$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 />';
    }
}
0 голосов
/ 06 июля 2011

Было бы полезно, если бы вы показали 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
0 голосов
/ 06 июля 2011

Ваш массив отсортирован неправильно, сотрудники с одинаковыми идентификаторами должны быть один за другим, для этого массива вы должны использовать метод 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 голосов
/ 06 июля 2011

Похоже, что массив отсортирован по job_title DESC, когда он должен быть отсортирован по company_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...