【问题标题】:Array foreach loop PHP数组 foreach 循环 PHP
【发布时间】:2020-05-17 22:17:11
【问题描述】:

大家好,这是我的情况:

我正在浏览包含 10 000 多个 cmets 的旧页面,我正在尝试将其导入 WordPress。

我正在使用 simple_html_dom.php 库,在这种情况下它并不重要。

我正在做的是获取一个包含 24 个第一个帖子的 URL,并通过它们获取一个带有 cmets 的元素。

$url = 'http://xx/aktualnosci,wszystkie,0,'.$x.'.html'; //some URL with first 24 posts
$html = file_get_html($url);

$articlesCount = 0;
$commentsCount = 0;

foreach ($html->find('ul.news_codrugi li') as $article) { //get all 24 posts urls
    $rawLink = $article->find('a');

    foreach ($rawLink as $testLink) {    
        $link = 'http://xx/'.$testLink->href;

        $rawTitle = $testLink->href;
        $rawTitle = explode(",", $rawTitle);
        $ggTitle = $rawTitle[1];
        $htmlNew = file_get_html($link);

        foreach ($htmlNew->find('div.komentarz_lista') as $comment) { //comment element
            $comm = $comment->find('p');
            foreach ($comm as $commText) {
                $cleanerCommText = trim(strip_tags($commText));
                $item['commRaw'] = $cleanerCommText;
                $comments[] = $item;
            }
            $commentsCount++;
        }
        $articlesCount++;
    }
    //unset($articles);
}

目前一切都很好,我已经在 Array 中获得了所有 cmets。 问题是cmets文本、日期和作者在

没有任何类或 ID 的项目,所以我没有单独获取它们的触发器,所以我的数组是

[0] => 文本,[1] => 日期和作者,[3] => 文本,[4] => 日期和作者等

我正在尝试将其放入一个新数组中,例如 [text] => text, [sign] => date and author :

$x = $commentsCount;
echo $x.'<br />';

$rawComm = array_column($comments, 'commRaw');
$rawCommCount = count($rawComm);

echo 'Pobrane wpisy: '.$rawCommCount.'<br />';
$z = 0;

foreach($rawComm as $commItem) {
    if($z % 2 == 0) {
        $commArr['text']    = $commItem;
    }else{
        $commArr['sign']    = $commItem;
        //echo $commItem;
    }
    echo 'Numer wpisu: '.$z.'<br />';
    $z++;
}

在最后一个循环foreach($rawComm as $commItem) 中,当我回显这些值时,一切都很好,我已经正确打印了评论文本和评论日期和作者。但是当我试图将它放入一个新数组 $commArr 时,我得到了双倍的项目,所以我的数组是两倍大,所有的东西都翻了一番。

为什么我需要在新数组中使用它?因为我想把它放到数据库中。

所以在这一点上,我不知道是什么导致了这个问题。有什么帮助吗? :)

谢谢

【问题讨论】:

  • 为什么不能用已有的数组直接插入到数据库中?
  • 因为我需要获取评论的用户名,然后通过另一个数据库找到他的电子邮件将其嵌套在一起,然后将其放入结束数据库。除此之外,在这种情况下,我将不得不执行两个 SQL 查询,一个用于文本,下一个用于使用日期和作者更新第一个
  • 而且在这种情况下也没关系,我想知道的是为什么我在最后一个循环中将所有内容加倍。
  • 您的 foreach 返回数组中的所有 ['text']['sign'] ,如 $values[1]; $values[2];echo 'Numer wpisu: '.$z.'&lt;br /&gt;'; $z++;。因此它们不会是您要求显示的相同请求的数组中的值的两倍。

标签: php arrays loops foreach


【解决方案1】:

我不是 wp 编码员,多年来我一直将它用于演示!你可以像这样使用密钥,至少我会在 php 中做些什么。

    $a = array(
      array(
        'id' => 5698,
        'first_name' => 'Peter',
        'last_name' => 'Griffin',
      ),
      array(
        'id' => 4767,
        'first_name' => 'Ben',
        'last_name' => 'Smith',
      ),
      array(
        'id' => 3809,
        'first_name' => 'Joe',
        'last_name' => 'Doe',
      )
    );
//Collect array values excrated from foreach
    $Collected_array_result = array();
    foreach($a as $key => $value ) {
        $Collected_array_result[':'.$key] = $value;
    }
   //Create another array from that values 
    print_r($Collected_array_result);

输出

Array ( [:0] => Array ( [id] => 5698 [first_name] => Peter [last_name] => Griffin ) [:1] => Array ( [id] => 4767 [first_name] => Ben [last_name] => Smith ) [:2] => Array ( [id] => 3809 [first_name] => Joe [last_name] => Doe ) );

以及如何放入db

$stmt = $pdo->prepare("INSERT INTO comments ( " . implode(', ',array_keys($a)) . ") VALUES (" . implode(', ',array_keys($Collected_array_result)) . ")");
$result = $stmt->execute($Collected_array_result);

从数组中获取名称并创建一个带有名称的新数组:

$first_name = array_column($a, 'first_name', 'id');
print_r($first_name);

输出

Array ( [5698] => Peter [4767] => Ben [3809] => Joe );

更新:在@Dharman 评论 sql 注入和使用准备好的语句在 db 中插入数据时,没有要求插入有问题的查询,但如果您使用该查询,请从数组中过滤值或使用喜欢以下。

$first_name = array_column($a, 'first_name');
$first = implode(', ', $first_name);
 echo $first;

$last_names = array_column($a, 'last_name');
$last = implode(', ', $last_names);
 echo $last;

$id = array_column($a, 'id');
$iddd = implode(', ', $id);
 echo $iddd;

$sql = "INSERT INTO comments (first_name, last_names) VALUES (?,?)";
$stmt= $pdo->prepare($sql);
$stmt->execute([$first, $last]);

内爆数组中的所有值并逐个添加到查询 1。

【讨论】:

  • 现在如何管理它:我数组中的每个奇数都有键 ['text'],每个偶数都有键 ['sign']??
  • array_chunk() 不完全是我想要的,但做得足够了 :) 非常感谢大家的帮助 :)
  • 实际上$first_name = array_column($a, 'first_name', 'id'); print_r($first_name); 是您的解决方案,但print_r(array_chunk($a, 2)); 会做得很好。取决于你需要什么。
  • 不,因为我的阵列看起来不像那样。我的数组的键只是数字 0,1,2,3,4 .. 等取决于如何从帖子中获取鬃毛。我的数组的每个偶数键都是注释文本,数组中的每个奇数键都包含前一个键的日期和用户名
  • 如果数组键不是常量并且由程序员控制,您的代码仍然容易受到 SQL 注入的攻击。最好避免像这样动态构建语句。
【解决方案2】:

您将获得两次数组,因为您使用 if 条件在奇数和偶数期间将整个数组值 $commItem 添加到 $commArr。这就是为什么你得到数组双倍时间。

替换你的代码

foreach($rawComm as $commItem) {
    if($z % 2 == 0) {
        $commArr['text']    = $commItem;
    }else{
        $commArr['sign']    = $commItem;
        //echo $commItem;
    }
    echo 'Numer wpisu: '.$z.'<br />';
    $z++;
}

到这个

foreach($rawComm as $commItem) {    
    $commArr[] = array('text'=>$commItem[0], 'sign'=>$commItem[1]);
}

我认为这可能对你有用:)。

【讨论】:

  • 我不知道 OP 数组是什么样的,但是当我在 localhost 上的答案中尝试使用数组时,这个解决方案会给出一个通知:未定义的偏移量:错误。
  • @Dilek 我正在回答 MattWhistler 的问题,而不是你的问题。它不会给他带来错误。如果您只需要重新检查并转换为您的要求。或者发布一个新问题,我一定会提供帮助。
  • @DroidDev 我不能那样做。仅仅因为 $rawCom 看起来像这样: [0] => text, [1] => sign, [2] => text, [3] => sign ... 等等所以这个数组中的每一秒值都是以前的值女巫包含评论文本。我无法以其他方式管理它,因为 foreach ($htmlNew->find('div.komentarz_lista') as $comment) 包含两个

    一个是评论文本,第二个是评论的符号(日期和用户名)

猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多