Как структурно отобразить многомерный массив в PHP? - PullRequest
3 голосов
/ 29 июня 2011

Как отобразить содержимое массива следующим образом:

 Company Name
  - Username1
  - Username2
 Another Company Name
  - Username3

Массив, который я создал, выглядит следующим образом:

$array[1]['company_id'] = '12';
$array[1]['company_name'] = 'ABC Company';
$array[1]['company_type'] = 'default';
$array[1]['user_id'] = '23';
$array[1]['user_name'] = 'Andrew';

$array[2]['company_id'] = '12';
$array[2]['company_name'] = 'ABC Company';
$array[2]['company_type'] = 'default';
$array[2]['user_id'] = '27';
$array[2]['user_name'] = 'Jeffrey';

$array[3]['company_id'] = '1';
$array[3]['company_name'] = 'Some Company';
$array[3]['company_type'] = 'default';
$array[3]['user_id'] = '29';
$array[3]['user_name'] = 'William';

$array[4]['company_id'] = '51';
$array[4]['company_name'] = 'My Company';
$array[4]['company_type'] = 'default';
$array[4]['user_id'] = '20';
$array[4]['user_name'] = 'Jaime';

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

Это должно сделать это:

<code>$array[1]['company_id'] = '12';
$array[1]['company_name'] = 'ABC Company';
$array[1]['company_type'] = 'default';
$array[1]['user_id'] = '23';
$array[1]['user_name'] = 'Andrew';

$array[2]['company_id'] = '12';
$array[2]['company_name'] = 'ABC Company';
$array[2]['company_type'] = 'default';
$array[2]['user_id'] = '27';
$array[2]['user_name'] = 'Jeffrey';

$array[3]['company_id'] = '1';
$array[3]['company_name'] = 'Some Company';
$array[3]['company_type'] = 'default';
$array[3]['user_id'] = '29';
$array[3]['user_name'] = 'William';

$array[4]['company_id'] = '51';
$array[4]['company_name'] = 'My Company';
$array[4]['company_type'] = 'default';
$array[4]['user_id'] = '20';
$array[4]['user_name'] = 'Jaime';

foreach( $array as $company ) {
  $companies[$company['company_name']]['users'][] = $company['user_name'];
}


echo '<pre>' . print_r( $companies, true ) . '
';foreach ($ companies как $ companyname => $ company) {echo $ companyname.'«;foreach ($ company ['users'] as $ user) {echo '-'.$ user.'«;}}
0 голосов
/ 29 июня 2011

Это должно быть сделано с существующей структурой за одну итерацию ( demo ):

$currentCompanyId = 0;
foreach ($array as $company) {
    if ($currentCompanyId !== $company['company_id']) {
        printf("%s\n", $company['company_name']);
        $currentCompanyId = $company['company_id'];
    }
    printf("\t-%s\n", $company['user_name']);
}

Выход:

ABC Company
    -Andrew
    -Jeffrey
Some Company
    -William
My Company
    -Jaime

Фрагмент предполагает, что массив отсортирован по названию компании (как показано в вашем примере кода). Если это не так, сначала выполните сортировку по идентификатору компании:

usort($array, function($companyA, $companyB) {
    return $companyA['company_id'] - $companyB['company_id'];
});
0 голосов
/ 29 июня 2011

сначала нужно организовать их в компании:

$companies = array();
foreach($array as $i => $user)
{
  $id = $user['company_id'];
  if(!isset($companies[$id])){
    $companies[$id] = array(
       'company_name' => $user['company_name'],
       'company_type' => $user['company_type'],
       'company_id' => $id,
       'users' => array();
    );
  }

  $companies[$id]['users'][] = array(
     'user_name' => $user['user_name'],
     'user_id' => $user['user_id']
  );

  unset($array[$i]); // just remove the element from the source array... not necessary but possibly useful if its a HUGE list.
}

Тогда вы можете просто проходить и выводить.

0 голосов
/ 29 июня 2011

Только один подход.Это реструктурирует массив, чтобы связать пользователей по компании, а затем просто перебирает их.

$companies = array();
foreach($array as $user)
{
    $companies[$user['company_name']][] = $user['user_name'];
}

foreach($companies as $name => $userlist)
{
    echo $name . '<br />';

    foreach($userlist as $user)
    {
        echo ' - ' . $user . '<br />';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...