Как искать строку в массиве в PHP? - PullRequest
0 голосов
/ 03 мая 2020

, поэтому я получил этот большой xml, который можно найти по здесь , и я храню в своей базе данных как settype-setId-partId, и я хочу отфильтровать неизвестные строки и заменить их. Вот что я попробовал:

<?php
try {
    $conn = new PDO("mysql:host=localhost;dbname=db", "root", "");
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
$figuredata = simplexml_load_file("figuredata.xml");

$users = $conn->prepare("SELECT figure, username from players");
$users->execute();
$users = $users->fetchAll(PDO::FETCH_OBJ);

foreach($figuredata->sets->settype as $settype) {
    foreach($settype->set as $set) {
        foreach($set->part as $part) {
            foreach($users as $user ) {
                $lookArr = explode(".",$user->figure);
                foreach($lookArr as $look ){
                    $lookArrNew = explode("-", $look);
                    if($lookArrNew[1] != $set->attributes()->id && $lookArrNew[2] != $part->attributes()->id) {
                        echo "fail";
                    }

                }
            }   
        }
    }
}

Но он возвращает сбой для каждой строки. Что мне делать?

1 Ответ

0 голосов
/ 03 мая 2020

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

При этом используется выражение XPath //set[@id="'.$lookArr[1].'"]/part[@id="'.$lookArr[2].'"], который будет выглядеть как //set[@id="3774"]/part[@id="3329"]. Это значение <set> со значением атрибута для id = 3774, которое имеет <part> с атрибутом id 3329.

xpath() возвращает список, поэтому, если оно пустое, значение isn ' t найдено.

$users = $users->fetchAll(PDO::FETCH_OBJ);

foreach($users as $user ) {
    $lookArr = explode(".",$user->figure);
    foreach($lookArr as $look ){
        $lookArr = explode("-",$figure);
        $set = $figuredata->xpath('//set[@id="'.$lookArr[1].'"]/part[@id="'.$lookArr[2].'"]');
        if ( empty($set) )   {
            echo "fail";
        }
        else    {
            echo $set[0]->asXML();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...