Массив foreach l oop PHP - PullRequest
       6

Массив foreach l oop PHP

3 голосов
/ 01 февраля 2020

Привет всем, вот мой случай:

Я просматриваю старую страницу с более чем 10 000 комментариев, которые я пытаюсь импортировать в WordPress.

Я использую библиотеку simple_html_dom. php, которая в данном случае не важна.

Что я делаю, так это получаю URL с 24 первыми сообщениями, просматривающими их, и получаю элемент с комментариями.

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

На данный момент все довольно хорошо, у меня есть все комментарии в массиве. Проблема в том, что текст комментария, дата и автор находятся в элементе

без какого-либо класса или идентификатора, поэтому у меня нет триггера для их раздельного получения, поэтому мой массив -

[0] => текст, [1] => дата и автор, [3] => текст, [4] => дата и автор и др. c

Я пытаюсь вставить это в новый массив, такой как [текст] => текст, [знак] => дата и автор:

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

В последнем l oop foreach($rawComm as $commItem), когда я отображаю значения, все в порядке, я ' у нас есть текст комментария и дата комментария и автор напечатаны правильно Но когда я пытаюсь поместить его в новый массив $commArr, я получаю двойные элементы, поэтому мой массив в два раза больше с удвоенным количеством.

И зачем он мне нужен в новом массиве? Потому что я хочу поместить его в БД.

Итак, на данный момент, я не знаю, что вызывает эту проблему. Любая помощь? :)

Спасибо

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы получаете массив два раза, потому что вы добавляете значение всего массива $commItem к $commArr во время нечетных и четных чисел, используя условие if. Вот почему вы получаете массив дважды.

Замените ваш код

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

Я думаю, это может сработать для вас:).

0 голосов
/ 01 февраля 2020

Я не 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 ) );

И как положить в БД

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

output

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

UPDATE : В комментарии @Dharman для sql инъекции и вставки данных в БД с использованием подготовленного оператора, не запрашивался запрос на вставку в вопросе, но в если вы используете этот запрос, пожалуйста, отфильтруйте значения из массива или используйте, как показано ниже.

$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 на 1.

...