【问题标题】:Preg_match_all returning multidimensional array - trouble accessing elementsPreg_match_all 返回多维数组 - 访问元素时遇到问题
【发布时间】:2017-04-11 22:36:58
【问题描述】:

假设我希望将类似 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, 
}

【问题讨论】:

  • foreach($matches['Array'] as $v){ - 这应该给出什么?如果您不想知道数组中有什么,请不要使用 echo。输出 $matches 与 var_dump 或 print_r。
  • @Krpcannon 我想帮助您找到解决此问题的方法。你能做一个var_export($matches),将该数据发布到你的问题中,然后ping我吗?

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


【解决方案1】:

我用一些“发明”的身体做了一个快速测试:

$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);
}

【讨论】:

  • 查看编辑。当我用 var_dump 测试 $matches 数组时,它返回 'array'
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多