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

时间:2017-12-18 10:02:06

标签: php arrays

我有一个像这样的数组:

     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
        )
    )

3 个答案:

答案 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密钥很有用,因为我在您的其他问题中已经看到您需要利用(计算)这些数据部分。