【问题标题】:How to create an array from database?如何从数据库创建数组?
【发布时间】:2010-04-30 17:57:53
【问题描述】:

请帮我从我的数据库的一个字段中创建一个数组。该字段具有用逗号分隔的记录。下图为:

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
)

【问题讨论】:

  • 为什么名字以_fld结尾。
  • 只是一个名字,没什么特别的。 :)

标签: php mysql arrays


【解决方案1】:
$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 将对所有元素应用修剪。

trim 将删除标签两侧的任何空白。

【讨论】:

  • 我也会加入trim
  • 我试过这个,我收到错误消息“警告:在 C:\wamp\www\test\untitled4.php 第 20 行数组 () 上为 foreach() 提供的参数无效”
  • 改为使用while,循环,试试看。
  • 完美的使用 while, 循环。谢谢。
  • 好。对于那个很抱歉。小心array_merge。现在想来,您可能无法按照最初的要求获得两份“教程”。
【解决方案2】:

其实我会先把normalize这个表分成多个表。

文章

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

【讨论】:

    【解决方案3】:

    更新

    您也可以使用 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
    )
    

    【讨论】:

    • 输出是“Array ([0] => PHP, coding, scripting [1] => Javascript, scripting, tutorial [2] => CSS, tutorial, web design)”跨度>
    • 哎呀!对不起索菲安!现在我明白你想要什么了!我的错!让我改变它!
    • 输出:数组 ( [0] => PHP [1] => 编码 [2] => 脚本 Javascript [3] => 脚本 [4] => 教程 CSS [5] => 教程[6] => web design ) // 键 2 上的“scripting”和“javascript”之间应该有一个逗号,键 4 上的“tutorial”和“CSS”之间应该有一个逗号。
    • 哇! ;-) 又更新了一次,这次我亲测了! ;-)
    • 你错过了左侧“trim”的单引号
    【解决方案4】:

    这应该会输出所有内容。

    $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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2015-09-11
      相关资源
      最近更新 更多