2017-12-18 54 views
-4

我有一個是這樣的一個數組:如何將記錄添加到先前定義的數組

 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

回答

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

,然後使用array_search()中的$key將值插入先前生成的索引中。另外,你應該將消息保存爲嵌套數組,並將其設置爲適當的關聯數組。

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; 
    } 
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()用於重新索引第一環路之後的陣列。然而,就你而言,保留你的密鑰是有用的,因爲我在你的其他問題中看到你需要利用(計數)這些數據部分。

相關問題