开发者

How to structurally display a multi-dimensional array in PHP?

开发者 https://www.devze.com 2023-03-16 15:47 出处:网络
How can I display the contents of an array as follows: Company Name - Username1 - Username2 Another Company Name

How can I display the contents of an array as follows:

 Company Name
  - Username1
  - Username2
 Another Company Name
  - Username3

The array I have created is as follows:

$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开发者_C百科[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';


This should do it:

$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 ) . '</pre>';


foreach( $companies as $companyname => $company ) {
   echo $companyname . '<br />';
   foreach( $company['users'] as $user ) {
       echo '  - ' . $user . '<br />';
   }
}


Just one approach. This restructures the array to associate users by company, then just iterates through them.

$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 />';
    }
}


first you need to get them organized by company:

$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.
}

Then you can just loop through and output.


This should do it with the existing structure in one iteration (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']);
}

Output:

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

The snippet assumes the array is sorted by Company Name (like shown in your code example). If that isnt the case, sort it by Company ID first:

usort($array, function($companyA, $companyB) {
    return $companyA['company_id'] - $companyB['company_id'];
});
0

精彩评论

暂无评论...
验证码 换一张
取 消