@Historian111

Можно ли как то перебрать такой массив в одном цикле и сохранить в БД в Yii2?

Исправил немного вопрос и пост по просьбам людей и администрации сайта

Добрый вечер. Простите за возможно детские вопросы, к сожалению не так много времени на любимое занятие, и в паузах просто выветривается все из головы, из за этого постоянно каша в голове.

В общем суть такая, можно ли его перебрать в одном цикле и сразу же сохранить в бд результат? И как правильно это сделать? Выделил что нужно взять у каждого ключа массива. В следующем цикле ключи идентичны

Уверен, что ответ очень прост, но никак не могу понять... Хотя вроде раньше спокойно работал с массивами..... Не пинайте сильно.

Работаю в Yii2 и если не трудно, покажите пример как реализовать все это там?

Мой класс
public function tournaments($date, $timestamp){
        $requests = $this->request("//$date/json?_=$timestamp");

//        $result = [];
//        foreach ($requests['sportItem']['tournaments'] as $key => $request){
//            $result['tournament'] .= $request['tournament']['name'];
//            $result['tournament'] .= $request['tournament']['uniqueId'];
//            $result[] = $request['category']['name'];
//            $result[] = $request['category']['id'];
//            $result[] = $request['season']['year'];
//        }

        return $requests['sportItem']['tournaments'];
    }


request, подставление в ссылку части сайта, к которой подключаюсь и идет парсинг. Форич делал просто на локалке, без фреемворка. В модель уже настроил на таблицу в бд. Создал
контроллер
<?php


namespace app\controllers;



use yii\web\Controller;
use app\components\parseTennis;

class TennisController extends Controller
{
        protected $header =заголовки
        ];
        protected $referer = 'сайт';


    public function actionIndex(){
        $tennis = parseTennis::app("https://www.sofascore.com/tennis")
            ->set(CURLOPT_REFERER, $this->referer)
            ->set(CURLOPT_USERAGENT, $this->header);
        $result = $tennis->tournaments(date("Y-m-d"), time('d', 'm', 'Y'));

        return $this->render('index', ['result' => $result]);
    }
}
, возможно не правильно, где передаю параметры и получаю данные массива.
Массив
[0] => Array
(
              [tournament] => Array
                  (
                      [name] => Roland Garros, Paris, France
                      [slug] => roland-garros-paris-france
                      [id] => 66712
                      [uniqueId] => 2480
                      [uniqueName] => Roland Garros
                )

            [category] => Array
                          (
                      [name] => ATP
                      [slug] => atp
                      [priority] => 7
                      [id] => 3
                      [flag] => atp
                )

            [season] => Array
                          (
                              [name] => 2019 French Open Men Singles
                              [slug] => 2019-french-open-men-singles
                              [year] => 2019
                              [id] => 20188
                )
      )


и т.д. Только первый ключ меняется с 0 на 1 и т.д, и меняются все значения.

Данные мне нужны такие, от tournament uniqueIdunique Name, от category name, id, от season year

Буду очень благодарен за любую помощь:)

update
Модель
<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "tournaments".
 *
 * @property int $id
 * @property string $name
 * @property int $uniqueId
 * @property string $category
 * @property int $categori_id
 * @property int $year
 */
class Tennis extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'tournaments';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['uniqueId', 'categori_id', 'year'], 'integer'],
            [['name'], 'string', 'max' => 255],
            [['category'], 'string', 'max' => 50],
            [['uniqueId'], 'unique'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Name',
            'uniqueId' => 'Unique ID',
            'category' => 'Category',
            'categori_id' => 'Categori ID',
            'year' => 'Year',
        ];
    }
}


И немного переделанный
контроллер
public function actionIndex(){


        $tennis = parseTennis::app("https://www.sofascore.com/tennis")
            ->set(CURLOPT_REFERER, $this->referer)
            ->set(CURLOPT_USERAGENT, $this->header);
        $results = $tennis->tournaments(date("Y-m-d"), time('d', 'm', 'Y'));

        $tournamentName = [];
        $tournamentUniqueId = [];
        $categoryName = [];
        $categoryId = [];
        $seasonYear = [];
        foreach ($results['sportItem']['tournaments'] as $request){
            $tournamentName[] = $request['tournament']['name'];
            $tournamentUniqueId[] = $request['tournament']['uniqueId'];
            $categoryName[] = $request['category']['name'];
            $categoryId[] = $request['category']['id'];
            $seasonYear[] = $request['season']['year'];
        }

        $model = new Tennis();
        $model->name = $tournamentName;
        $model->uniqueId = $tournamentUniqueId;
        $model->category = $categoryName;
        $model->categori_id = $categoryId;
        $model->year = $seasonYear;

        return $this->render('index', [
                            'model' => $model,
        ]);
    }


Единственное не понимаю, как все это передать в БД:(
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
deepblack
@deepblack
Сферический код в вакууме:
spoiler
$data =   array (
        [1] => array(
            'title' => "xxxxx",
            'content' => "xxxxx",
            'category' => "xxxxx",
        ), 
        [2] => array(
            'title' => "xxxxx",
            'content' => "xxxxx",
            'category' => "xxxxx",
        ), 
        [3] => array(
            'title' => "xxxxx",
            'content' => "xxxxx",
            'category' => "xxxxx",
        ), 
     );

if(is_array($data)){
    foreach($data as $row){
        $sql = "INSERT INTO `table`( `title`, `content`, `category`) values";

        $title = mysql_real_escape_string( $row['title'] );
        $content = mysql_real_escape_string( $row['content'] );
        $category = mysql_real_escape_string( $row['category'] );

        $sql .= "('" . $title . "','" . $content, "','" $category "')";
        mysql_query($sql) or exit(mysql_error()); 
    }
}


Используйте MySQLi вместо MySQL
А вообще ответ легко гуглится:
https://stackoverflow.com/questions/39818418/using...
https://stackoverflow.com/questions/15013211/how-t...

UPD:

От того что структура вложенная ничего особо не меняется:
spoiler
if(is_array($data)){
    foreach($data as $row){
        $tournamentName = $row['tournament']['name'];
        $tournamentSlug = $row['tournament'][];
        $tournamentId = $row['tournament'][];
        $tournamentUniqueId = $row['tournament'][];
        $tournamentUniqueName = $row['tournament'][];

        $categoryName = $row['category']['name'];
        $categorySlug = $row['category']['slug'];
        $categoryPriority = $row['category']['priority'];
        $categoryId = $row['category']['id'];
        $categoryFlag = $row['category']['flag'];
    }
}

Но тут есть нюанс, дальнейшая работа с БД зависит от того как вы собираетесь хранить эти данные.
Т.е. непонятно как описаны модели данных в которых вы хотите хранить эту информацию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы