/ 網站開發

2022年07月15日 66

array_count_values 應用,實作熱門標籤排序功能


array_count_values 是『計算陣列值重複次數』用的函式
當一群陣列值混雜在一起,方便統計各別數據的數量,用此範例來說

<?php
   $array = array('AA', 'AA', 'BB', 'BB', 'CC', 'AA', 'BB', 'AA', 'CC', 'DD');
   $results = array_count_values($array);
   echo json_encode($results);

會得到以下JSON結果,統計出在陣列中出現的次數

{
AA: 4,
BB: 3,
CC: 2,
DD: 1
}

這樣就可以用來做文章『熱門標籤』的排序應用,依最多使用的標籤遞減排序

<?php
# tags sort
    // $limitAmt => 預設數量 > 1 的才抓取使用
	function tagSort($limitAmt=1) {
		$CI =& get_instance();
		$CI->load->model('article_model');

		$tagsRows = $CI->article_model->tagsCount();
		$tagsMerge = $tagsArray = array();

		// tag陣列合併
		foreach ($tagsRows as $key => $value) {
			// 過濾空白資料
			if (!empty($value['tags']) && $value['tags'] != '[""]') {
				$jsonToArray = json_decode($value['tags'], true);
				$tagsMerge = array_merge($tagsMerge, $jsonToArray);	// 合併陣列
			}
		}

		// 統計出現次數 => 重新整理 tags array
		$tagsRateArray = array_count_values($tagsMerge);
		// echo json_encode($tagsRateArray);	exit;

		foreach ($tagsRateArray as $key => $value) {
			$tagsArray[] = array('name' => $key, 'amt' => $value);
		}

		// $isEn = "/^([a-zA-Z0-9\s]+)$/";	// 判斷是否含英數&空白
		// $isCht = "/([\x81-\xfe][\x40-\xfe])/";	// 判斷是否含中文

		foreach ($tagsArray as $key => $value) {
			$tagsCounts = $value['amt'];

			// 判斷tag 數量 > 指定數{$limitAmt}才顯示
			if ($tagsCounts > $limitAmt) {
				$new_tagsArray[] = $value;
			}
		}

		if (!empty($new_tagsArray)) {
			// 熱門程度排序
			foreach ($new_tagsArray as $key => $value) {
	    		$tagsTotal[$key] = $value['amt'];
			}
			array_multisort($tagsTotal, SORT_DESC, $new_tagsArray);

			return $new_tagsArray;
		}
	}

產出的結果就會依熱門程度,由多至少依序排序結果

[
{
name: "3D列印",
amt: 6
},
{
name: "玩具",
amt: 5
},
{
name: "雞湯文",
amt: 4
},
{
name: "API",
amt: 3
},
{
name: "Javascript",
amt: 3
},
{
name: "PHP",
amt: 3
}
]

參考資料:array_count_values

標籤: #PHP , #MySQL