array_combine с одинаковыми именами ключей

Я пытаюсь сохранить некоторую информацию из электронного письма в массив.
Содержимое электронной почты — это HTML-таблицы, и я использую метод DOMDocument getElementsByTagName('td') получить все тд.

В цикле for я перебираю все электронные письма в почтовой папке и сохраняю информацию в массиве. Это выглядит так:

function getMails()
{
$mailbox = imap_mailboxmsginfo($this->imap);
$msglength = $mailbox->Nmsgs;
$domhtml = new DOMDocument();
$arraykeys = [];
$arrayvalues = [];
// loop a) to iterate through all mails in the folder
for ($i = 1; $i <= $msglength; $i++)
{
$html = imap_fetchbody($this->imap, $i, '2');
$domhtml->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$tabledatas = $domhtml->getElementsByTagName('td');
// loop aa) to save the heading td's in the html mail in an array
for ($y = 0; $y < $tabledatas->length; $y+=2)
{
$arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
}
// loop ab) to save the content td's in the html mail in an array
for ($z = 1; $z < $tabledatas->length; $z+=2)
{
$arrayvalues[] = ($tabledatas->item($z)->nodeValue);
}
// combine the 2 arrays into one array with all td's information
$array = array_combine($arraykeys, $arrayvalues);
}
imap_close($this->imap);
}

Почему я использую один массив для заголовка td и один для содержимого td, можно объяснить, посмотрев html из почты:

<h2>Section one</h2>

<table>
<tr>
<td>Heading_value_a:</td>
<td>Content_value_a</td>
</tr>
<tr>
<td>Heading_value_b:</td>
<td>Content_value_b</td>
</tr>
<tr>
<td>Heading_value_c:</td>
<td>Content_value_c</td>
</tr>
</table>

<h2>Section two</h2>

<table>
<tr>
<td>Heading_value_d:</td>
<td>Content_value_d</td>
</tr>
<tr>
<td>Heading_value_e:</td>
<td>Content_value_e</td>
</tr>
<tr>
<td>Heading_value_f:</td>
<td>Content_value_f</td>
</tr>
</table>

<h2>Section three</h2>

<table>
<tr>
<td>Heading_value_g:</td>
<td>Content_value_g</td>
</tr>
<tr>
<td>Heading_value_h:</td>
<td>Content_value_h</td>
</tr>
<tr>
<td>Heading_value_i:</td>
<td>Content_value_i</td>
</tr>
</table>

<h2>Subsection three</h2>

<table>
<tr>
<td>Heading_value_g:</td>
<td>Content_value_g</td>
</tr>
<tr>
<td>Heading_value_h:</td>
<td>Content_value_h</td>
</tr>
<tr>
<td>Heading_value_i:</td>
<td>Content_value_i</td>
</tr>
</table>

Это дает мне этот массив:

Array
(
[Heading_value_a] => Content_value_a
[Heading_value_b] => Content_value_b
[Heading_value_c] => Content_value_c
[Heading_value_d] => Content_value_d
[Heading_value_e] => Content_value_e
[Heading_value_f] => Content_value_f
[Heading_value_g] => Content_value_g
[Heading_value_h] => Content_value_h
[Heading_value_i] => Content_value_i
)

Когда я объединяю два массива в один, я теряю информацию из подраздела три, потому что заголовки td из раздела три имеют то же имя, что и заголовки подраздела три, и новый массив будет иметь индексы с тем же именем, поэтому мне нужно переименовать индексы массива для подраздела три. Подраздел три тд имеют индекс 42 и выше. Я выяснил, как дать новому массиву некоторые другие имена индексов для сохранения информации, добавив текущий индекс td к имени индекса массива в цикле aa):

if ($y <= 41)
{
$arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
} else
{
$arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':').$y;
}

Это дает мне этот массив:

Array
(
[Heading_value_a] => Content_value_a
[Heading_value_b] => Content_value_b
[Heading_value_c] => Content_value_c
[Heading_value_d] => Content_value_d
[Heading_value_e] => Content_value_e
[Heading_value_f] => Content_value_f
[Heading_value_g] => Content_value_g
[Heading_value_h] => Content_value_h
[Heading_value_i] => Content_value_i
[Heading_value_g42] => Content_value_g
[Heading_value_h44] => Content_value_h
[Heading_value_i46] => Content_value_i
)

Есть ли способ добавить числа от 2 и выше к новому имени индекса массива? Если в почте больше подразделов три, то в новом массиве появится индекс, [Heading_value_g2], [Heading_value_h2], [Heading_value_i2], [Heading_value_g3], [Heading_value_h3], [Heading_value_i3] и так одно. Моя цель — следующий массив:

Array
(
[Heading_value_a] => Content_value_a
[Heading_value_b] => Content_value_b
[Heading_value_c] => Content_value_c
[Heading_value_d] => Content_value_d
[Heading_value_e] => Content_value_e
[Heading_value_f] => Content_value_f
[Heading_value_g] => Content_value_g
[Heading_value_h] => Content_value_h
[Heading_value_i] => Content_value_i
[Heading_value_g2] => Content_value_g
[Heading_value_h2] => Content_value_h
[Heading_value_i2] => Content_value_i
)

У меня была идея инициализировать переменную count, такую ​​как $ c в цикле aa), с условием if и установить для него значение td с помощью троичного оператора, шаги для td — от 42 до 64 для подраздела три один, от 66 до 88 для подраздела три два и так один:

for ($y = 0; $y < $tabledatas->length; $y+=2)
{
if ($y < 42)
{
$arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
} else
{
$c = ($y >= 42 && $y <= 64) ? '2' : ($y >= 66 && $y <= 88 ? '3' : '');
$arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':').$c;
}
}

Это работает, и я получаю желаемый результат, но он недостаточно динамичен, что если есть более одного или двух подразделов три, то мне пришлось написать троичный оператор с большим количеством условий, подобных этому, для работы с 3 подразделами три:

$c = ($y >= 42 && $y <= 64) ? '2' : ($y >= 66 && $y <= 88 ? '3' : ($y >= 90 && $y <= 112 ? '4' : 'and more conditions' ));

Кто-нибудь намек, как я мог бы справиться с этим, чтобы работать с бесконечным количеством подразделов три?
Заранее спасибо.

0

Решение

Вы должны рассмотреть «разбиение» на основной ассоциативный массив элементов, чтобы исправить первоначальную проблему перезаписи дубликата ключа:

function.array-chunk.php

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]