如何将记录添加到先前定义的数组

问题描述:

我有一个是这样的一个数组:如何将记录添加到先前定义的数组

 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 
     ]; 
    } 

现在的问题是与其他声明。基本上,如果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 
     ) 
    ) 
+1

阅读[PHP arrays](http://php.net/manual/en/language.types.array。PHP)并且不要退出,直到你到达[使用方括号访问数组元素]部分(http://php.net/manual/en/language.types.array.php#language.types.array.syntax .accessing)。 – axiac

+0

如果代码是私密的,答案也是私密的。当你在这里发布时,你给Stack Exchange一个不可更新的许可证来分发内容;因此破坏行为将得到回复。 – EJoshuaS

您应该使用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; 
} 

,然后使用array_search()中的$key将值插入先前生成的索引中。另外,你应该将消息保存为嵌套数组,并将其设置为适当的关联数组。

你需要得到正确的发送者,然后发送邮件追加到它, 类似:

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; 
    } 

在您的类似答案中,由于您自己的破坏行为而被删除,我发布了最佳做法。我建议使用临时密钥来减少阵列扫描并提高效率:

我做了很多修复/改进。您只需要一个临时阵列($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()用于重新索引第一环路之后的阵列。然而,就你而言,保留你的密钥是有用的,因为我在你的其他问题中看到你需要利用(计数)这些数据部分。