在web 開發中,用戶提交表單時,常常需要比對提交的數據與原始數據,特別是在修改用戶信息的場景下。比如用戶修改了個人資料,而我們希望檢測哪些字段被修改過。 PHP 提供的array_diff_assoc()函數可以幫助我們輕鬆完成這個任務。今天,我們將通過一個實際的案例,來學習如何利用這個函數檢測表單中修改過的字段。
array_diff_assoc()函數用於計算兩個數組的差異,基於鍵名和鍵值的對比。它返回一個包含在第一個數組中但不在第二個數組中的元素。需要注意的是,它不僅會對比數組的值,還會對比數組的鍵名,因此它比array_diff()更加嚴格。
函數原型:
<span><span><span class="hljs-title function_ invoke__">array_diff_assoc</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
$array1 :第一個數組。
$array2 :第二個數組。
返回值:一個包含$array1中所有與$array2不同的元素的數組。
假設我們有一個用戶修改資料的表單,用戶提交的信息包含名字、郵箱、電話等字段。我們希望通過原始的用戶數據與提交的表單數據對比,檢測出哪些字段已經被修改。
首先,定義一個包含用戶原始數據的數組和一個包含用戶提交數據的數組。
<span><span><span class="hljs-comment">// 假設這是數據庫中存儲的原始用戶信息</span></span><span>
</span><span><span class="hljs-variable">$original_data</span></span><span> = [
</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'John Doe'</span></span><span>,
</span><span><span class="hljs-string">'email'</span></span><span> => </span><span><span class="hljs-string">'[email protected]'</span></span><span>,
</span><span><span class="hljs-string">'phone'</span></span><span> => </span><span><span class="hljs-string">'123-456-7890'</span></span><span>
];
</span><span><span class="hljs-comment">// 假設這是用戶提交的修改後的表單數據</span></span><span>
</span><span><span class="hljs-variable">$submitted_data</span></span><span> = [
</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'John Doe'</span></span><span>, </span><span><span class="hljs-comment">// 名字沒有改</span></span><span>
</span><span><span class="hljs-string">'email'</span></span><span> => </span><span><span class="hljs-string">'[email protected]'</span></span><span>, </span><span><span class="hljs-comment">// 郵箱改了</span></span><span>
</span><span><span class="hljs-string">'phone'</span></span><span> => </span><span><span class="hljs-string">'123-456-7890'</span></span><span> </span><span><span class="hljs-comment">// 電話沒改</span></span><span>
];
</span></span>
接下來,使用array_diff_assoc()對比原始數據和提交的數據,找出哪些字段被修改了。
<span><span><span class="hljs-comment">// 使用 array_diff_assoc 來找出修改過的字段</span></span><span>
</span><span><span class="hljs-variable">$changed_fields</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_assoc</span></span><span>(</span><span><span class="hljs-variable">$submitted_data</span></span><span>, </span><span><span class="hljs-variable">$original_data</span></span><span>);
</span><span><span class="hljs-comment">// 輸出修改過的字段</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$changed_fields</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"修改過的字段有:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$changed_fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$key</span></span></span><span>: </span><span><span class="hljs-subst">$value</span></span><span>\n";
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有修改任何字段。\n"</span></span><span>;
}
</span></span>
<span><span>修改過的字段有:
</span><span><span class="hljs-symbol">email</span></span><span><span class="hljs-punctuation">:</span></span><span> john.doe</span><span><span class="hljs-meta">@newdomain</span></span><span>.com
</span></span>
在本例中, array_diff_assoc()會比對submitted_data和original_data兩個數組的鍵和值。
由於名字和電話沒有改變,只有郵箱字段被認為是不同的,因此輸出結果顯示email字段已經被修改。
假設除了檢測修改過的字段外,我們還想知道用戶是否在表單中提交了修改。如果某些字段在原始數據中不存在,而在提交的數據中卻有,那麼可以通過array_diff_assoc()和array_diff_key()的組合來判斷。
<span><span><span class="hljs-comment">// 使用 array_diff_key 來檢測用戶是否提交了新的字段</span></span><span>
</span><span><span class="hljs-variable">$new_fields</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_key</span></span><span>(</span><span><span class="hljs-variable">$submitted_data</span></span><span>, </span><span><span class="hljs-variable">$original_data</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$new_fields</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"提交了新的字段:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$new_fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$key</span></span></span><span>: </span><span><span class="hljs-subst">$value</span></span><span>\n";
}
}
</span></span>
array_diff_assoc()是一個非常實用的函數,能夠幫助我們輕鬆地檢測哪些字段在用戶提交的表單中發生了修改。在實際開發中,這個函數常常用於用戶資料修改、訂單修改等場景,確保我們能夠準確地追踪到變化。
通過上述示例,你可以快速實現對比原始數據和用戶提交數據的功能,幫助你更好地處理用戶輸入和表單驗證。