Массив Php для решения проблемы с функцией pow number реверсирует

<style>
.red{color:red;}
.green{color:green;}
</style>
<?php
function array2aiflag($inputString){
    $arAIFlag = ["AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"];
    $retValue = 0;
    $arInputString = explode(",",$inputString);
    for($i=0;$i<sizeof($arAIFlag);$i++) {
        $tempString = $arAIFlag[$i];
        for ($j=0;$j<30;$j++){
            if (isset($arInputString[$j])){
                    $tempString2 = $arInputString[$j];
            }else{
                $tempString2 = $inputString;
            }
            if (strcmp($tempString2,$tempString) == 0){
                $retValue+=pow(2,$i);
            }           
            if (strcmp($tempString2,"") == 0){
                break;
            }
        }
    }
    unset($arInputString);
    return $retValue;
}
function aiflag2array($flag,$target=[],$str = ""){
    $tar=["AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"];
    for($x=0;$x<count($tar);$x++){
        $target[pow(2,$x)]=$tar[$x];
    }   
    for($i=count($tar)-1;$i>-1;$i--){
        $pow = pow(2, $i);
        if ($pow < $flag){
            $str = ",".$target[$pow].$str;
            $flag = $flag-$pow;
        }elseif ($pow == $flag){
            return "".$target[$pow].$str;
        }
    }
    return "NONE";
}


$sample=["AGGR","AGGR,BERSERK","AGGR,BERSERK,DEATHBLOW,REVIVE","AGGR,BERSERK,STONESKIN","AGGR,BERSERK,STONESKIN,DEATHBLOW","AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE","AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE","AGGR,DEATHBLOW","AGGR,GODSPEED","AGGR,GODSPEED","AGGR,NOATTCHUNJO","AGGR,NOATTJINNO","AGGR,NOATTSHINSU","AGGR,NOMOVE","AGGR,REVIVE","AGGR,STONESKIN","BERSERK","BERSERK,STONESKIN","COWARD","NOMOVE","AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW","NOMOVE,STONESKIN","NOMOVE,STONESKIN","REVIVE"];
foreach($sample as $k=>$v){
    $no1=array2aiflag($v);
    $no2=array2aiflag(aiflag2array($no1));
    if ($v != aiflag2array($no1)){
        echo '<a class = "red"> OriginalData - <b>'.$v.' ['.$no1.']</b> - ReversData - <b>'.aiflag2array($no1).' ['.$no2.']</b><br>';
    }else{      
        echo '<a class = "green"> OriginalData - <b>'.$v.' ['.$no1.']</b> - ReversData - <b>'.aiflag2array($no1).' ['.$no2.']</b><br>';
    }
}
?>

Когда я запускаю приведенный выше код, я преобразовываю 24 образца данных в сложенное число и печатаю его. Затем, когда я хочу вызвать числа из базы данных и преобразовать их обратно в строки, некоторые из них кажутся неправильными.

Результат:

OriginalData - AGGR [30] - ReversData - NOMOVE,COWARD,NOATTSHINSU,NOATTCHUNJO [30]
OriginalData - AGGR,BERSERK [129] - ReversData - AGGR,BERSERK [129]
OriginalData - AGGR,BERSERK,DEATHBLOW,REVIVE [3201] - ReversData - AGGR,BERSERK,DEATHBLOW,REVIVE [3201]
OriginalData - AGGR,BERSERK,STONESKIN [385] - ReversData - AGGR,BERSERK,STONESKIN [385]
OriginalData - AGGR,BERSERK,STONESKIN,DEATHBLOW [1409] - ReversData - AGGR,BERSERK,STONESKIN,DEATHBLOW [1409]
OriginalData - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457] - ReversData - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457]
OriginalData - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457] - ReversData - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457]
OriginalData - AGGR,DEATHBLOW [1025] - ReversData - AGGR,DEATHBLOW [1025]
OriginalData - AGGR,GODSPEED [513] - ReversData - AGGR,GODSPEED [513]
OriginalData - AGGR,GODSPEED [513] - ReversData - AGGR,GODSPEED [513]
OriginalData - AGGR,NOATTCHUNJO [17] - ReversData - AGGR,NOATTCHUNJO [17]
OriginalData - AGGR,NOATTJINNO [33] - ReversData - AGGR,NOATTJINNO [33]
OriginalData - AGGR,NOATTSHINSU [9] - ReversData - AGGR,NOATTSHINSU [9]
OriginalData - AGGR,NOMOVE [3] - ReversData - AGGR,NOMOVE [3]
OriginalData - AGGR,REVIVE [2049] - ReversData - AGGR,REVIVE [2049]
OriginalData - AGGR,STONESKIN [257] - ReversData - AGGR,STONESKIN [257]
OriginalData - BERSERK [3840] - ReversData - STONESKIN,GODSPEED,DEATHBLOW,REVIVE [3840]
OriginalData - BERSERK,STONESKIN [384] - ReversData - BERSERK,STONESKIN [384]
OriginalData - COWARD [120] - ReversData - NOATTSHINSU,NOATTCHUNJO,NOATTJINNO,ATTMOB [120]
OriginalData - NOMOVE [60] - ReversData - COWARD,NOATTSHINSU,NOATTCHUNJO,NOATTJINNO [60]
OriginalData - AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW [1667] - ReversData - AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW [1667]
OriginalData - NOMOVE,STONESKIN [258] - ReversData - NOMOVE,STONESKIN [258]
OriginalData - NOMOVE,STONESKIN [258] - ReversData - NOMOVE,STONESKIN [258]
OriginalData - REVIVE [61440] - ReversData - NONE [0]

Требуется обратный инжиниринг. Проблема с числом 30 в функции aiflag2array.

Функция array2aiflag не должна изменяться. aiflag2array необходимо отредактировать.

Буду признателен, если вы поможете мне это исправить. Благодарю.

jdoodle.com/iembed/v0/oEs Мгновенный тест
ulusanyazilim 18.03.2022 14:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я подумал, что это хорошая вещь для работы. Я должен сказать, что я скучаю по контексту, я понятия не имею, для чего это будет использоваться. Контекст важен для понимания кода. Я так понимаю, это какая-то игра?

Первое, что нужно сделать, это убрать определения массива:

$states = ["AGGR",
           "NOMOVE",
           "COWARD",
           "NOATTSHINSU",
            "NOATTCHUNJO",
           "NOATTJINNO",
           "ATTMOB",
           "BERSERK",
           "STONESKIN",
           "GODSPEED",
           "DEATHBLOW",
           "REVIVE"];

$samples = ["AGGR",
            "AGGR,BERSERK",
            "AGGR,BERSERK,DEATHBLOW,REVIVE",
            "AGGR,BERSERK,STONESKIN",
            "AGGR,BERSERK,STONESKIN,DEATHBLOW",
            "AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE",
            "AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE",
            "AGGR,DEATHBLOW",
            "AGGR,GODSPEED",
            "AGGR,GODSPEED",
            "AGGR,NOATTCHUNJO",
            "AGGR,NOATTJINNO",
            "AGGR,NOATTSHINSU",
            "AGGR,NOMOVE",
            "AGGR,REVIVE",
            "AGGR,STONESKIN",
            "BERSERK",
            "BERSERK,STONESKIN",
            "COWARD",
            "NOMOVE",
            "AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW",
            "NOMOVE,STONESKIN",
            "NOMOVE,STONESKIN",
            "REVIVE"];

Я использовал $states и $samples. Конечно, вы можете изменить эти имена. Важно то, что вы не делаете свои строки слишком длинными, не более 80-100 символов.

Далее идет код для преобразования из того, что я называю flags, в states и наоборот:

function states2flags($userStates, $allStates)
{
    $userFlags = 0;
    $bit = 1;
    foreach ($allStates as $state) {
        if (in_array($state, $userStates)) {
           $userFlags += $bit;
        }
        $bit <<= 1;
    }
    return $userFlags;
}

function flags2states($userFlags, $allStates)
{
    $userStates = [];
    $bit = 1;
    foreach ($allStates as $state) {
        if ($userFlags & $bit) {
           $userStates[] = $state;
        }
        $bit <<= 1;
    }
    return $userStates;
}

Единственная особенная вещь здесь — это Побитовый оператор присваивания. Для работы со степенями двойки pow() не требуется.

Каждый параметр функции представляет собой массив, это сделано намеренно. Он явно задуман как массив, так зачем использовать строки? В качестве альтернативы вы можете работать только со строками, но не смешивайте массивы и строки, это сбивает с толку.

Я сохранил большую часть вашего тестового кода, хотя имена изменились:

foreach($samples as $sample) {
    $sampleStates  = explode(",", $sample);
    $sampleFlags   = states2flags($sampleStates, $states);
    $reverseStates = flags2states($sampleFlags, $states);
    $reverseFlags  = states2flags($reverseStates, $states);
    $textColor = (count(array_diff($sampleStates, $reverseStates)) > 0) ? "red" : "green";
    echo '<a class = "' . $textColor . '">' . $textColor . ' Original Data - <b>' . $sample .
         ' [' . $sampleFlags . ']</b> - Reverse Data - <b>' .
         implode(",", flags2states($sampleFlags, $states)) . ' ['.$reverseFlags. ']</b><br>';
}

Результат:

green Original Data - AGGR [1] - Reverse Data - AGGR [1]
green Original Data - AGGR,BERSERK [129] - Reverse Data - AGGR,BERSERK [129]
green Original Data - AGGR,BERSERK,DEATHBLOW,REVIVE [3201] - Reverse Data - AGGR,BERSERK,DEATHBLOW,REVIVE [3201]
green Original Data - AGGR,BERSERK,STONESKIN [385] - Reverse Data - AGGR,BERSERK,STONESKIN [385]
green Original Data - AGGR,BERSERK,STONESKIN,DEATHBLOW [1409] - Reverse Data - AGGR,BERSERK,STONESKIN,DEATHBLOW [1409]
green Original Data - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457] - Reverse Data - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457]
green Original Data - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457] - Reverse Data - AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE [3457]
green Original Data - AGGR,DEATHBLOW [1025] - Reverse Data - AGGR,DEATHBLOW [1025]
green Original Data - AGGR,GODSPEED [513] - Reverse Data - AGGR,GODSPEED [513]
green Original Data - AGGR,GODSPEED [513] - Reverse Data - AGGR,GODSPEED [513]
green Original Data - AGGR,NOATTCHUNJO [17] - Reverse Data - AGGR,NOATTCHUNJO [17]
green Original Data - AGGR,NOATTJINNO [33] - Reverse Data - AGGR,NOATTJINNO [33]
green Original Data - AGGR,NOATTSHINSU [9] - Reverse Data - AGGR,NOATTSHINSU [9]
green Original Data - AGGR,NOMOVE [3] - Reverse Data - AGGR,NOMOVE [3]
green Original Data - AGGR,REVIVE [2049] - Reverse Data - AGGR,REVIVE [2049]
green Original Data - AGGR,STONESKIN [257] - Reverse Data - AGGR,STONESKIN [257]
green Original Data - BERSERK [128] - Reverse Data - BERSERK [128]
green Original Data - BERSERK,STONESKIN [384] - Reverse Data - BERSERK,STONESKIN [384]
green Original Data - COWARD [4] - Reverse Data - COWARD [4]
green Original Data - NOMOVE [2] - Reverse Data - NOMOVE [2]
green Original Data - AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW [1667] - Reverse Data - AGGR,NOMOVE,BERSERK,GODSPEED,DEATHBLOW [1667]
green Original Data - NOMOVE,STONESKIN [258] - Reverse Data - NOMOVE,STONESKIN [258]
green Original Data - NOMOVE,STONESKIN [258] - Reverse Data - NOMOVE,STONESKIN [258]
green Original Data - REVIVE [2048] - Reverse Data - REVIVE [2048]

Вот PHP-скрипт. Возможно, это может быть дополнительно оптимизировано. Обход полного массива всех состояний не является оптимальным.

KIKO Software 18.03.2022 15:47

Извините, что поздно вернулся к вам. Огромное спасибо. Ты великолепен...

ulusanyazilim 19.03.2022 22:20

Другие вопросы по теме