У меня есть метки в моей учетной записи gmail, у которых есть вложенные метки, например, такие как (Работа/Программирование). Я разрабатываю PHP, у меня есть этот код для отображения списка ярлыков
$service_gmail = new Google_Service_Gmail( $client );
$lab = ( ! empty( $_GET['label'] ) ) ? $_GET['label'] : 'INBOX';
$labelsResponse = $service_gmail->users_labels->listUsersLabels('me');
$labels = array_merge($labels, $labelsResponse->getLabels());
<?php if ( ! empty( $labels ) ) {
foreach ( $labels as $key => $label ) :
?>
<tr>
<td width="1%"><span class="num"><?php echo ( $key + 1 ); ?></span></td>
<td><h5><?php echo $label['name'];?></h5>
<small><?php echo $label['type'];?></small></td>
<td><?php echo $service_gmail->users_labels->get( 'me', $label['id'] )->getMessagesUnread();?></td>
<td><?php echo $service_gmail->users_labels->get( 'me', $label['id'] )->getMessagesTotal(); ?></td>
</tr>
<?php
endforeach;
}
?>
но я хочу отображать вложенные метки в виде подслоев основной метки, например
Work
- accounting
- programming
- ......
Social
- facebook (Social/facebook)
- twitter (Social/twitter)
Так можно ли это сделать без жесткого кодирования, поэтому мне нужно, чтобы все было динамичным?
У вас будет 2 массива $ main_labels и $ sub_labels. В цикле foreach вы увидите, содержит ли имя метки символ '/'. Если это так, вы взорвите() имя метки с помощью '/'. Затем вы будете искать в $ main_labels, если первая часть (до/) уже существует. Если это так, вы сохраните вторую часть в $ sub_labels. Наконец, чтобы повторить метки, вы будете перебирать массив $ main_labels и внутри цикла вы увидите, что $ sub_labels [$ main_lbl_key] не пуст. Если он не пуст, есть подкатегории, и вам нужно написать еще один цикл над $ sub_labels [$ main_lbl_key], чтобы повторить их.
Например, например:
<?php
$service_gmail = new Google_Service_Gmail( $client );
$lab = ( ! empty( $_GET['label'] ) ) ? $_GET['label'] : 'INBOX';
$labelsResponse = $service_gmail->users_labels->listUsersLabels('me');
$labels = array_merge($labels, $labelsResponse->getLabels());
$main_labels = $sub_labels = array();
function ifMainLabelExists($lbl) {
global $main_labels;
foreach ($main_labels as $k => $l) {
if (strcmp($lbl['name'], $l) === 0) {
return $k;
}
}
return -1;
}
if ( ! empty( $labels ) ) {
foreach ( $labels as $key => $label ) {
if (strpos($label['name'], '/') !== false) {
$label_parts = explode('/', $label['name']); // break label name at character '/'
if (count($label_parts) > 1) {
$m = ifMainLabelExists($label_parts[0]);
if ($m !== -1) { // main label already exists
$label['name'] = $label_parts[1];
$sub_labels[$m][] = $label;
} else { // main label does not exist already
$label['name'] = $label_parts[0];
$main_labels[] = $label;
$m = count($main_labels) - 1; // will be inserted at last index
$label['name'] = $label_parts[1];
$sub_labels[$m][] = $label;
}
}
} else {
$main_labels[] = $label;
}
}
}
// now echo them