簡體   English   中英

從數據庫表中提取的逗號分隔值行創建單個值的平面數組

[英]Create flat array of individual values from rows of comma-separated values fetched from a database table

請幫我從我的數據庫的一個字段中創建一個數組。 該字段具有用逗號分隔的記錄。 下面是插圖:

ID | article_title_fld         | article_tags_fld                     |
----------------------------------------------------------------------
1  | Learn PHP                 | PHP, coding, scripting               |
3  | Javascript Tutorial       | Javascript, scripting, tutorial      |
4  | Styling with CSS          | CSS, tutorial, web design            |

我想收集article_tags_fld中的所有記錄,然后將其放入 1 個數組中。 也許我把它命名為$array1 ,打印出來如下:

Array
(
[0] => PHP
[1] => coding
[2] => scripting
[3] => Javascript
[4] => scripting
[5] => tutorial
[6] => CSS
[7] => tutorial
[8] => web design
)
$array1 = array();
$result = mysql_query("SELECT article_tags_fld FROM MY_TABLE");
while ($row = mysql_fetch_assoc($result)) {
   $array1 = array_merge($array1, array_map('trim', explode(",", $row['article_tags_fld'])));
}

explode將通過定界符分割字符串。

array_merge將合並兩個數組。

array_map將修剪應用於所有元素。

修剪會刪除標簽兩側的空白。

實際上,我首先將表標准化為多個表。

文章

article_ID | article_title_fld         |
----------------------------------------
1          | Learn PHP                 |
3          | Javascript Tutorial       |
4          | Styling with CSS          |

標簽

tag_ID | tag_title_fld |
------------------------
1      | PHP           |
2      | coding        |
3      | scripting     |
4      | Javascript    |
5      | tutorial      |
6      | CSS           |
7      | web design    |

article_tags

article_ID | tag_ID |
---------------------
1          | 1      |
1          | 2      |
1          | 3      |
3          | 4      |
3          | 3      |
3          | 5      |
4          | 6      |
4          | 5      |
4          | 7      |

然后在PHP中

$array1 = array();
$result = mysql_query("
SELECT tag_title_fld
FROM tags
JOIN articles_tags USING(tag_ID)
ORDER BY article.article_ID
");
foreach($result as $row) { 
   $array1[] = $row['tag_title_fld'];
   // With count. See below for the query it goes with
   // $array2 = array();
   // $array2['tag'] = $row['tag_title_fld'];
   // $array2['count'] = $row['tag_count'];
   // $array1[] = $array2;
}

當然,如果您只想要一個沒有重復的標簽列表,則可以使用此查詢。

SELECT tag_title_fld
FROM tags

以及如果您希望他們使用它們的頻率來計數:

SELECT tag_title_fld, COUNT(*) AS tag_count
FROM tags
JOIN articles_tags USING(tag_ID)
GROUP BY tag_title_fld

更新

您也可以通過使用mysql_fetch_Array來做到這一點

$array1 = array();
$result = mysql_query("SELECT ID , article_tags_fld FROM my_table");

while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
    $array1[] = $row['article_tags_fld'];
    // OR 
    // $array1[] = $row[1];
}

添加:一行:

// use this version to behave as in your example..
$array1 = array_map('trim',explode(',',implode(',',$array1))); 

// use this version with array_unique for a non duplicate way...    
$array1 = array_unique(array_map('trim',explode(',',implode(',',$array1)))); 

顯示:

 print_r( $array1 );

Array
(
    [0] => PHP
    [1] => coding
    [2] => scripting
    [3] => Javascript
    [4] => scripting
    [5] => tutorial
    [6] => CSS
    [7] => tutorial
    [8] => web design
)

這應該輸出所有內容。

$pdo = new PDO( /* CONNECTION */ );
$stmt = $pdo->query( 'SELECT article_tags_fld FROM TABLENAME' );

function mapFunc( $row ){ return explode( ',', $row[ 0 ] ) }

$all = array();
foreach( array_map( 'mapFunc', $stmt->fetchAll() ) as $row )
{
   $all = array_merge( $all, $row );
}
// $all now holds all of the values.
  1. 您應該規范化您的數據庫表,以便您的行中沒有逗號分隔的值。
  2. mysql_函數不應再使用,所以我將演示 mysqli 的面向對象語法。
  3. 如果您的數據庫值始終以逗號分隔,那么explode()就可以了。 如果您的article_tags_fld值中可能有前導或尾隨空格,那么您可以在 SQL 中TRIM() 如果您可能在每個逗號后沒有空格,那么您可以使用preg_split()使用/, */之類的模式來分解字符串。
  4. 來自 mysqli 查詢的結果集 object 可以通過foreach()進行迭代,因此您可以安全地避免進行迭代fetch()調用來訪問數據列。
  5. 通過使用擴展運算符 (...) 推動展開的值,結果數組將是平坦的。
  6. 如果要從結果中刪除重復值,可以在循環完成后對結果數組調用array_unique()

現代化代碼:( 完整的 MYSQL + PHP 演示

$result = [];
foreach ($mysqli->query("SELECT article_tags_fld FROM MY_TABLE") as $row) {
    array_push($result, ...explode(', ', $row['article_tags_fld']));
}
var_export(array_unique($result));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM