array_combine 键名相同
array_combine with same key names
我正在尝试将电子邮件中的一些信息保存到数组中。
电子邮件内容是 html 表格,我正在使用 DOMDocument 方法 getElementsByTagName('td')
接收所有 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 标题与第三小节标题同名,新数组的索引也同名,这就是为什么我需要重命名第三小节的数组索引。第三小节 td 的索引为 42 或更高。我想出了如何给新数组一些其他索引名称来保存信息,方法是在循环 aa):
中将当前 td 索引添加到数组索引名称
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
)
我有想法用if条件初始化aa)循环中的$c之类的计数变量,并用三元运算符将其设置为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' ));
有没有人提示我如何管理它以处理无限数量的第三小节?
提前谢谢你。
您应该考虑 "chunking" 元素的主关联数组来解决重复键覆盖的原始问题:
我正在尝试将电子邮件中的一些信息保存到数组中。
电子邮件内容是 html 表格,我正在使用 DOMDocument 方法 getElementsByTagName('td')
接收所有 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 标题与第三小节标题同名,新数组的索引也同名,这就是为什么我需要重命名第三小节的数组索引。第三小节 td 的索引为 42 或更高。我想出了如何给新数组一些其他索引名称来保存信息,方法是在循环 aa):
中将当前 td 索引添加到数组索引名称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
)
我有想法用if条件初始化aa)循环中的$c之类的计数变量,并用三元运算符将其设置为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' ));
有没有人提示我如何管理它以处理无限数量的第三小节? 提前谢谢你。
您应该考虑 "chunking" 元素的主关联数组来解决重复键覆盖的原始问题: