【问题标题】:PHP Arrays: How to get this hexadecimal value from arrayPHP数组:如何从数组中获取这个十六进制值
【发布时间】:2021-08-08 19:49:42
【问题描述】:

我检索到这样一个数组:

echo "<pre>"; var_dump($trigger);

结果是:

array(5) {
  [0]=>
  object(phpseclib\Math\BigInteger)#372 (2) {
    ["value"]=>
    string(4) "0x02"
    ["engine"]=>
    string(3) "gmp"
  }
  [1]=>
  object(phpseclib\Math\BigInteger)#376 (2) {
    ["value"]=>
    string(4) "0x03"
    ["engine"]=>
    string(3) "gmp"
  }
  [2]=>
  object(phpseclib\Math\BigInteger)#371 (2) {
    ["value"]=>
    string(4) "0x01"
    ["engine"]=>
    string(3) "gmp"
  }
  [3]=>
  object(phpseclib\Math\BigInteger)#373 (2) {
    ["value"]=>
    string(6) "0x00a8"
    ["engine"]=>
    string(3) "gmp"
  }
  [4]=>
  array(6) {
    [0]=>
    object(phpseclib\Math\BigInteger)#383 (2) {
      ["value"]=>
      string(4) "0x0f"
      ["engine"]=>
      string(3) "gmp"
    }
    [1]=>
    object(phpseclib\Math\BigInteger)#377 (2) {
      ["value"]=>
      string(4) "0x0c"
      ["engine"]=>
      string(3) "gmp"
    }
    [2]=>
    object(phpseclib\Math\BigInteger)#381 (2) {
      ["value"]=>
      string(4) "0x1b"
      ["engine"]=>
      string(3) "gmp"
    }
    [3]=>
    object(phpseclib\Math\BigInteger)#380 (2) {
      ["value"]=>
      string(4) "0x05"
      ["engine"]=>
      string(3) "gmp"
    }
    [4]=>
    object(phpseclib\Math\BigInteger)#367 (2) {
      ["value"]=>
      string(4) "0x16"
      ["engine"]=>
      string(3) "gmp"
    }
    [5]=>
    object(phpseclib\Math\BigInteger)#418 (2) {
      ["value"]=>
      string(4) "0x17"
      ["engine"]=>
      string(3) "gmp"
    }
  }
}
array(5) {
  [0]=>
  object(phpseclib\Math\BigInteger)#407 (2) {
    ["value"]=>
    string(4) "0x03"
    ["engine"]=>
    string(3) "gmp"
  }
  [1]=>
  object(phpseclib\Math\BigInteger)#384 (2) {
    ["value"]=>
    string(4) "0x01"
    ["engine"]=>
    string(3) "gmp"
  }
  [2]=>
  object(phpseclib\Math\BigInteger)#394 (2) {
    ["value"]=>
    string(4) "0x01"
    ["engine"]=>
    string(3) "gmp"
  }
  [3]=>
  object(phpseclib\Math\BigInteger)#300 (2) {
    ["value"]=>
    string(4) "0x06"
    ["engine"]=>
    string(3) "gmp"
  }
  [4]=>
  array(6) {
    [0]=>
    object(phpseclib\Math\BigInteger)#401 (2) {
      ["value"]=>
      string(4) "0x14"
      ["engine"]=>
      string(3) "gmp"
    }
    [1]=>
    object(phpseclib\Math\BigInteger)#392 (2) {
      ["value"]=>
      string(4) "0x19"
      ["engine"]=>
      string(3) "gmp"
    }
    [2]=>
    object(phpseclib\Math\BigInteger)#404 (2) {
      ["value"]=>
      string(4) "0x02"
      ["engine"]=>
      string(3) "gmp"
    }
    [3]=>
    object(phpseclib\Math\BigInteger)#385 (2) {
      ["value"]=>
      string(4) "0x08"
      ["engine"]=>
      string(3) "gmp"
    }
    [4]=>
    object(phpseclib\Math\BigInteger)#399 (2) {
      ["value"]=>
      string(4) "0x0f"
      ["engine"]=>
      string(3) "gmp"
    }
    [5]=>
    object(phpseclib\Math\BigInteger)#299 (2) {
      ["value"]=>
      string(4) "0x0a"
      ["engine"]=>
      string(3) "gmp"
    }
  }
}
array(5) {
  [0]=>
  object(phpseclib\Math\BigInteger)#370 (2) {
    ["value"]=>
    string(4) "0x04"
    ["engine"]=>
    string(3) "gmp"
  }
  [1]=>
  object(phpseclib\Math\BigInteger)#376 (2) {
    ["value"]=>
    string(4) "0x03"
    ["engine"]=>
    string(3) "gmp"
  }
  [2]=>
  object(phpseclib\Math\BigInteger)#375 (2) {
    ["value"]=>
    string(4) "0x01"
    ["engine"]=>
    string(3) "gmp"
  }
  [3]=>
  object(phpseclib\Math\BigInteger)#398 (2) {
    ["value"]=>
    string(6) "0x00a8"
    ["engine"]=>
    string(3) "gmp"
  }
  [4]=>
  array(6) {
    [0]=>
    object(phpseclib\Math\BigInteger)#396 (2) {
      ["value"]=>
      string(4) "0x05"
      ["engine"]=>
      string(3) "gmp"
    }
    [1]=>
    object(phpseclib\Math\BigInteger)#378 (2) {
      ["value"]=>
      string(4) "0x0a"
      ["engine"]=>
      string(3) "gmp"
    }
    [2]=>
    object(phpseclib\Math\BigInteger)#379 (2) {
      ["value"]=>
      string(4) "0x0c"
      ["engine"]=>
      string(3) "gmp"
    }
    [3]=>
    object(phpseclib\Math\BigInteger)#373 (2) {
      ["value"]=>
      string(4) "0x13"
      ["engine"]=>
      string(3) "gmp"
    }
    [4]=>
    object(phpseclib\Math\BigInteger)#390 (2) {
      ["value"]=>
      string(4) "0x19"
      ["engine"]=>
      string(3) "gmp"
    }
    [5]=>
    object(phpseclib\Math\BigInteger)#388 (2) {
      ["value"]=>
      string(4) "0x1c"
      ["engine"]=>
      string(3) "gmp"
    }
  }
}

现在我需要获取十六进制值(例如:0x020x03 等)。

我已经尝试过var_dump($trigger[1]->value); 并且得到了这个:

object(GMP)#411 (1) {
  ["num"]=>
  string(1) "0"
}
object(GMP)#382 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#409 (1) {
  ["num"]=>
  string(1) "1"
}
object(GMP)#383 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#401 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#396 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#416 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#400 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#395 (1) {
  ["num"]=>
  string(1) "1"
}
object(GMP)#381 (1) {
  ["num"]=>
  string(1) "3"
}
object(GMP)#404 (1) {
  ["num"]=>
  string(1) "3"
}

但好像不是十六进制值!

那么我怎样才能正确地从这个$trigger 数组中获取十六进制值呢?

非常感谢你们的任何想法或建议......

提前致谢。

更新 #1:

如果我说var_dump($trigger[0][1]->value),我会收到此错误:

错误不能使用 phpseclib\Math\BigInteger 类型的对象作为数组

更新 #2:

我正在使用Tron API 来访问所有contract 信息。我可以正确获取所有门票信息,并且通过使用for loop,我可以将这个数组作为每张门票的结果。

执行此操作的代码如下:

         try {
            $totalTck = $TransactionBuilder->triggerSmartContract(
                (array)$abi,
                $contractH,
                $function,
                $params,
                $feeLimit,
                $addressH,
                $callValue = 0,
                $bandwidthLimit = 0);

            // $totalMinus = ($totalTck[0]->value) - 1; 
            $totalMinus = 10;
            for($i=0;$i<=$totalMinus;$i++){
                $address = ADDRESS;
                $addressH = $tron->toHex($address);
                $contract = CONTRACT;
                $contractH = $tron->toHex($contract);
                $function="getTicketInfo";
                $params=array("0"=>$i);
                $feeLimit=30000000;
                $callValue = 0;
                $bandwidthLimit = 0;
                try {
                    $trigger = $TransactionBuilder->triggerSmartContract(
                        (array)$abi,
                        $contractH,
                        $function,
                        $params,
                        $feeLimit,
                        $addressH,
                        $callValue = 0,
                        $bandwidthLimit = 0);

                    var_dump($trigger[0][1]->value);
                        //$query = DB::table('tickets')->insert([
                        //    'userId' => '',
                        //    'types' => '',
                        //    'startRound' => '',
                        //    'endRound' => '',
                        //   'numbers' => $trigger[0]->value
                        //]);
                } catch (\IEXBase\TronAPI\Exception\TronException $e) {
                    die($e->getMessage());
                }
            }
        } catch (\IEXBase\TronAPI\Exception\TronException $e) {
            die($e->getMessage());
        }

【问题讨论】:

  • 您是否查看过您正在使用的 BigInteger 类的文档?
  • @Jhecht 不,我认为没有必要获取数组的值
  • 这个问题需要更多的描述。你在哪里得到 $trigger?如果是一些模型记录的集合?或者从某个 API 端点获取它?
  • @sssurii 我正在使用 tron api 获取所有票务信息。然后通过使用 for 循环,我可以访问每张票,现在我需要获取这个十六进制数,然后将其转换为十进制数,但现在我无法获取十六进制数据:developers.tron.network
  • 您也在尝试var_dump($trigger[1]-&gt;value),但根据您的数据 $trigger 数组也有 2 个集合子集。所以我相信它应该像var_dump($trigger[0][1]-&gt;value) 给定模型类value 的属性phpseclib\Math\BigInteger 不受保护。

标签: php arrays laravel associative-array laravel-8


【解决方案1】:

BigInteger 类 有一个toHex() 方法。所以你可以像这样得到十六进制值:

echo '0x'.$trigger[0]->toHex();

您可以像这样遍历$trigger 数组:

foreach($trigger as $e)
{
    if(is_array($e))
    {
        foreach($e as $t)
            echo '0x'.$t->toHex().'<br>';
    }
    else
        echo '0x'.$e->toHex().'<br>';
}

【讨论】:

  • 你是对的 Oliver,但你将 $trigger[0] 作为十六进制值回显,我必须将此语法放在 for 循环中,如下所示:for($i=0;$i&lt;=$totalMinus;$i++){。所以在这个例子中,至少应该出现 10 个 Hex 值(因为$totalMinus = 10;)。该怎么做?
  • @KKKKKK 这是一个简单的数组迭代。查看我的更新。
  • 我测试得到:Call to a member function toHex() on array
  • 有趣的是echo '0x'.$trigger[0]-&gt;toHex(); 工作正常但foreach($trigger as $t) { echo $t-&gt;toHex(); } 返回错误!
  • 我刚刚注意到$trigger 有一个子数组。查看我的更新。
【解决方案2】:

首先,我建议您的循环(即 for、foreach)遍历数组,而不是使用如下数字索引访问项目:

foreach ($trigger as $item) {
  $item->value;
} 

现在查看您尝试访问的类属性:https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Math/BigInteger.php 这里的 Value 属性是私有的。看线:70 现在尝试通过返回value属性的可用公共方法访问value

foreach ($trigger as $item) {
  $item->toString(); 
 //OR
  $item->toHex();
}

如果你想修复没有。的迭代然后你可以for循环喜欢:

$totalMinus = 10;
for($i=0;$i<=$totalMinus;$i++){
    $trigger[$i]->toHex();
}

【讨论】:

  • 调用数组上的成员函数 toHex()
  • 调用数组上的成员函数 toString()
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 2020-03-05
  • 2021-02-21
  • 2014-02-18
  • 2011-07-12
  • 2014-01-04
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多