我有一个像这样的数组:
Array
(
[0] => Array
(
[0] => 108132368
[1] => Pouya
[2] => Vaghefi
[3] => Hi
)
[1] => Array
(
[0] => How r u
)
[2] => Array
(
[0] => 101524007
[1] => Pega
[2] =>
[3] => /start
)
[3] => Array
(
[0] => OKAY
)
[4] => Array
(
[0] => Hello?
)
)
背后的代码使得这一点在这里:
$sender_ids = array();
$sender_infos = array();
for($i=0;$i<$num;$i++){
$sender_id = $updateArray["result"][$i]["message"]["from"]["id"];
$sender_fname = $updateArray["result"][$i]["message"]["from"]["first_name"];
$sender_lname = $updateArray["result"][$i]["message"]["from"]["last_name"];
$sender_uname = $updateArray["result"][$i]["message"]["from"]["username"];
$sender_msg = $updateArray["result"][$i]["message"]["text"];
// sender id
if(!(in_array($sender_id, $sender_ids))){
$sender_ids[] = $sender_id;
$sender_infos[] = [
$sender_id,
$sender_fname,
$sender_lname,
$sender_msg
];
}else{
// $key = array_search($sender_id, $sender_ids);
$sender_infos[] = [
$sender_msg
];
}
现在问题在于 else 语句。基本上,如果再次重复sender_id
,则只会将sender_msg
添加到sender_info
。
但我想做的是将sender_msg
添加到之前已构建的数组中。实际上,它必须搜索已定义的sender_id
并将其他消息添加到其中。
所以完整的数组就是这样:
Array
(
[0] => Array
(
[0] => 108132368
[1] => Pouya
[2] => Vaghefi
[3] => Hi
[4] => How r u
[5] => Hello?
)
[2] => Array
(
[0] => 101524007
[1] => Pega
[2] =>
[3] => /start
[4] => OKAY
)
)
答案 0 :(得分:0)
您需要获取正确的发件人,然后将发件人邮件附加到其中, 类似的东西:
if(!(in_array($sender_id, $sender_ids))){
$sender_ids[] = $sender_id;
$sender_infos[$sender_id] = [
$sender_id,
$sender_fname,
$sender_lname,
'messages'=>[$sender_msg]
];
}else{
$sender_infos[$sender_id]['messages'][] = $sender_msg;
}
答案 1 :(得分:0)
您应该使用array_search()
代替in_array()
,如下所示:
if(false === $key = array_search($sender_id, $sender_ids)){
$sender_ids[] = $sender_id;
$sender_infos[] = [
'sender_id' => $sender_id,
'sender_fname' => $sender_fname,
'sender_lname' => $sender_lname,
'sender_msg' => [$sender_msg],
];
}else{
$sender_infos[$key]['sender_msg'][] = $sender_msg;
}
然后使用$key
中的array_search()
将值插入先前生成的索引中。此外,您应将消息保留为嵌套数组,并使其成为正确的关联数组。
答案 2 :(得分:0)
在您的类似答案中,由于您自己的故意破坏现在已删除,我发布了最佳做法。我建议使用临时密钥来减少阵列扫描并提高效率:
我做了很多修理/改进。您只需要一个临时数组(
$sender_infos
)。您应该使用id
作为密钥保存每个唯一用户的数组;这为你提供isset()
的速度。在第二个
foreach()
循环中,我交换了implode()
的内部循环来压缩代码块。
要非常直接,使用in_array()
或array_search()
将不会有效,因为他们将进行(可能是完整的)阵列扫描。 isset()
不会这样做,因此效率更高。
代码:(Demo)
$sender_infos = array();
foreach($updateArray["result"] as $message){
if(!isset($sender_infos[$message["message"]["from"]["id"]])){
$sender_infos[$message["message"]["from"]["id"]]=[
// 'sender_id' => $message["message"]["from"]["id"], // not used later
'sender_fname' => isset($message["message"]["from"]["first_name"]) ? $message["message"]["from"]["first_name"] : '',
// 'sender_lname' => isset($message["message"]["from"]["last_name"]) ? $message["message"]["from"]["lasst_name"] : '', // not used later
'sender_msg' => [$message["message"]["text"]]
];
}else{
$sender_infos[$message["message"]["from"]["id"]]['sender_msg'][]=$message["message"]["text"];
}
}
foreach($sender_infos as $sender_id=>$a){
echo $a['sender_fname'],"\n\t";
echo '<div class="direct-chat-text">';
echo implode("</div>\n\t<div class=\"direct-chat-text\">",$a['sender_msg']);
echo "</div>\n\n";
}
输出:
Pouya
<div class="direct-chat-text">asdsa</div>
<div class="direct-chat-text">asdsa</div>
<div class="direct-chat-text">jjjjj</div>
H.Z
<div class="direct-chat-text">Sj</div>
在许多情况下,array_values()
用于在第一个循环后重新索引数组。但是,在您的情况下,保留sender_id
密钥很有用,因为我在您的其他问题中已经看到您需要利用(计算)这些数据部分。