Помощ за четене на json масив

Pok4

Registered
Hello guys,
Имам заявка за тук, но съм от телефона и в чужбина и нямам лаптопа в мен. Понеже имам шоп система, която в момента може да се манипулира, ще задам питането си тук.
Имам json файл със следното:
PHP:
{
 
    "servers": {
        "server1": {
            "hostname": "Hostname 1",
            "ip_port": "192.168.1.135:27015",
            "allowed_flags": "a-1,b-2,c-3,d-1,e-1"
        },
        "server2": {
            "hostname": "Hostname 2",
            "ip_port": "192.168.1.135:27016",
            "allowed_flags": "a-4,b-1,c-1,d-1"
        },
        "server3": {
            "hostname": "Hostname 3",
            "ip_port": "112.163.1.135:27025",
            "allowed_flags": "a-4,b-1,c-1,d-1"          
        }
    }
 
 
}

Ако примерно знам айпито и порта на сървъра (ip_port) и флаговете, които са избрани - искам да взема числата срещу флаговете. (allowed_flags)
Ето давам и пример
Ип и порт 112.163.1.135:27025 и флагове b и d, тоест трябва да ми върне 1,1 или още по-добре, ако ги сумира и ми върне 2.
Както може да видите от json масива, става дума за Server3 в момента.
Флаговете ги имам сляти (bd) , но мога да ги отделя и със запетаи (b,d).
Флаговете са винаги една буква, докато цифрите срещу тях може да са две и повече.

Ще се радвам, ако някой даде готово решение, за да мога да го вкарам в системата. :)
 
Последно редактирано:
Сори за кода, но от мобилния не ми дава да ползвам ббкодове. Json файла е стандартизиран.
Edit: оправих го
 
Последно редактирано:
Ще дам простичък пример. Има възможност да се оптимизира, но идеята е да се разбере смисъла.
PHP:
<?php
$request = '{
    "servers": {
        "server1": {
            "hostname": "Hostname 1",
            "ip_port": "192.168.1.135:27015",
            "allowed_flags": "a-1,b-2,c-3,d-1,e-1"
        },
        "server2": {
            "hostname": "Hostname 2",
            "ip_port": "192.168.1.135:27016",
            "allowed_flags": "a-4,b-1,c-1,d-1"
        },
        "server3": {
            "hostname": "Hostname 3",
            "ip_port": "112.163.1.135:27025",
            "allowed_flags": "a-4,b-1,c-1,d-1"
        }
    }
}';
$searchIp = '192.168.1.135:27016';
$findFlags = '';
$json = json_decode($request, true);
$servers = $json['servers'] ?? [];
foreach ($servers as $serverKey => $server) {
    $serverIp = $server['ip_port'] ?? '';
    $serverFlags = $server['allowed_flags'] ?? '';
    if (empty($serverIp) || empty($serverFlags)) {
        continue;
    }
    if ($serverIp == $searchIp) {
        $findFlags = $serverFlags;
        break;
    }
}
var_dump($findFlags);


 
  • Like
Реакции: Pok4
Мерси! Това е малко над половината функционалност според мен. Мисля, че ще трябва и масив, който да държи числата и след това да ги сумира?
 
Мисля, че имам идея как да стане с функцията get string between, но за целта, някой може ли да удари едно рамо и да каже как този стринг $flags='bd';
Да стане:
$flags='b-,d-';
Трябва да е форматиран така, тоест запетайка и тирета без запетайка на края.
После ще има foreach, вътре функцията и масив да вкарва числата вътре.
 
Ето завършен вариант използвайки на @dakata__92 кода.

PHP:
<?php
$request = '{
    "servers": {
        "server1": {
            "hostname": "Hostname 1",
            "ip_port": "192.168.1.135:27015",
            "allowed_flags": "a-1,b-2,c-3,d-1,e-1"
        },
        "server2": {
            "hostname": "Hostname 2",
            "ip_port": "192.168.1.135:27016",
            "allowed_flags": "a-4,b-1,c-1,d-1"
        },
        "server3": {
            "hostname": "Hostname 3",
            "ip_port": "112.163.1.135:27025",
            "allowed_flags": "a-4,b-1,c-1,d-1"
        }
    }
}';

$searchIp = '192.168.1.135:27016';

echo calculateFlagsForServer($request, $searchIp, 'ab'); // резултат: 5

function calculateFlagsForServer($request, $searchIpPort, $flags = '')
{
    $foundFlags = '';
    $json = json_decode($request, true);
    $servers = $json['servers'] ?? [];
    foreach ($servers as $serverKey => $server) {
        $serverIp = $server['ip_port'] ?? '';
        $serverFlags = $server['allowed_flags'] ?? '';
        if (empty($serverIp) || empty($serverFlags)) {
            continue;
        }
        if ($serverIp == $searchIpPort) {
            $foundFlags = processFlags($serverFlags);
            break;
        }
    }
    
    return sumFlags($flags, $foundFlags);   
}

function processFlags($flags)
{
    $splitByComma = explode(",", $flags);

    $processedFlags = [];   
    foreach ($splitByComma as $flag) {
        list($letter, $digits) = explode("-", $flag);
        $processedFlags[$letter] = $digits;
    }
    
    return $processedFlags;
}

function sumFlags($flags, $flagsArray)
{
    $sum = 0;
    for ($i = 0; $i < mb_strlen($flags); $i++) {
        $sum += $flagsArray[$flags[$i]];
    }
    
    return $sum;
}
 
  • Like
Реакции: Pok4
Супер! Благодаря и на двама ви! Ще тествам при първа възможност на лаптопа!
Ако има проблем, ще пиша пак.
 

Back
Горе