Preg_match_all返回多维数组 - 访问元素时遇到问题

时间:2016-11-28 08:56:26

标签: php multidimensional-array preg-match-all

假设我想在类似Twitter的帖子中将主题标签存储在自己的主题标签表中。我遇到的问题是,似乎这个循环在字符串名称列中存储字符串“Array”,而不是实际匹配。这似乎是一个问题,返回的数组是多维的?

preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches);
//for each loop array returned in matches
//create_hashtag()

//ISSUE with dimensionality of array
foreach($matches[0] as $v){
    create_hashtag($dbh, $v);
    attach_hashtag($dbh, $pid, $v);
}

正如你所看到的,我试图通过在第0位调用数组来解决这个问题,但这不起作用。

可能问题出在被调用的函数中:

function attach_hashtag($dbh, $pid, $tagname) {
//insert into Tagged

try {
$sql = 'INSERT INTO Tagged (hashtag_name, post_id)
        VALUES (:name, :pid);';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':name', $tagname);
$stmt->bindParam(':pid', $pid);
$stmt->execute(); 

$array = [
    'status' => 1,
    ];
    return $array;
} catch (Exception $ex){
$array = [
    'status' => 0,
    ];
    return $array;
}}

function create_hashtag($dbh, $tagname) {

try {
$sql = 'INSERT INTO Hashtags (name)
        VALUES (:name);';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':name', $tagname);
$stmt->execute(); 

$array = [
    'status' => 1,
    ];
    return $array;
} catch (Exception $ex){
$array = [
    'status' => 0,
    ];
    return $array;
}
    //insert into Hashtags}

编辑: 我使用var_dump来确保查询有效。

 //var_dump($pid); returns proper value
preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches);
//for each loop array returned in matches

//echo $matches['Array']; - why does this return "Array"
//ISSUE with dimensionality of array
foreach($matches['Array'] as $v){
    create_hashtag($dbh, $v);
    attach_hashtag($dbh, $pid, $v); //inserts into tagged, 
}

1 个答案:

答案 0 :(得分:0)

我做了一些"发明的快速测试"身体:

$body = 'fasd #has kfewf #tag lkfds #test 22 #fin';
preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches);
var_dump($matches);

结果是:

array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(4) "#has"
    [1]=>
    string(4) "#tag"
    [2]=>
    string(5) "#test"
    [3]=>
    string(4) "#fin"
  }
}

所以你的$ matches [0]应该没问题。现在可以检查一下,如果你的mysql查询成功了吗?请检查$ stmt-> execute()的返回值。如果错了,请查询您的问题。

$result = $stmt->execute(); 
if ($!result) {
   $error = $stmt->errorInfo();
   print_r($error);
}
相关问题