【问题标题】:Can not acces array value in php无法在php中访问数组值
【发布时间】:2017-04-13 12:42:02
【问题描述】:

有一个由 POST 数据组成的 php 数组 $this->log->write(print_r($array , true));

Array
(
[accept] => */*
[accept-encoding] => gzip, deflate
[signature] =>    37df88b6f845c21b1cda84cf3d3b94b0b15759b74f7387ceb0e9c8a6247c211f
[connection] => keep-alive
[content-length] => 610
[user-agent] => python-requests/2.10.0
)

$this->log->write(var_export($array , true).'var_export');

 array (
'accept' . "\0" . '' => '*/*',
'accept-encoding' . "\0" . '' => 'gzip, deflate',
'signature' . "\0" . '' => '37df88b6f845c21b1cda84cf3d3b94b0b15759b74f7387ceb0e9c8a6247c211f',
'connection' . "\0" . '' => 'keep-alive',
'content-length' . "\0" . '' => '610',
'user-agent' . "\0" . '' => 'python-requests/2.10.0',
)var_export

我无法使用$array['signature']; 访问数组值的问题是空的。

抱歉,问题看起来很棘手,但事实并非如此。之前使用数组没有问题。也试过这个$array["signature"];$array->signature;空返回。 请帮忙

【问题讨论】:

  • 请在您的问题中添加var_export($array),让我们准确了解您的 var 内容是什么,或者也可以添加 var_dump($array)。它也看起来你正在使用一个框架,它是哪个?
  • 请提供您正在填充$array 变量的确切代码。
  • 用 var_export 更新问题
  • "\0" 可能正在抛弃您的阵列。试试$array['signature'."\0"]
  • @S.M. Nat,如果您正在使用密钥消毒,请查看我更新的解决方案。你可能会发现它更紧凑。谢谢,

标签: php arrays object post associative-array


【解决方案1】:

如您所见,您的密钥以某种方式附加了\0(如果我的记忆好的话,这是 C 中的结束字符串字符)

这就是为什么当你尝试收集密钥 signature 时什么都没有,因为密钥是 signature\0

所以,你有两个解决方案,第一个是调用$array['signature' . "\0"],第二个是对数组键进行清理。

像这样:

$keys = array_map(function($key){ return trim($key); }, array_keys($array));
$array = array_combine($keys, array_values($array));
  • 第 1 步:修剪所有键
  • 第 2 步:将清理过的键重新关联到值

编辑

找出原因……至少如果您使用的是 PHP7

事实上,如果你从一个函数返回一个数组,这将在每个数组键的末尾添加空字节。见github问题https://github.com/CopernicaMarketingSoftware/PHP-CPP/issues/248 顺便说一句,我猜你的 PHP7 版本太旧了:p 请记住更新它;)

【讨论】:

    【解决方案2】:

    您可以通过以下方式访问它:

    $array["signature\0"];
    

    "\0" 被称为"NULL character",尽管它在输出数组时不可见,但在访问索引时会有所不同。

    这就是为什么 "signature" 和 "signature\0" 不一样的原因,即使它们都将输出 'signature',因为后者有 10 个字符,而前者只有 9 个字符,这使得它在用作索引时有所不同。

    如果您熟悉 C,那么您可以参考 "\0" 用于结束字符串,否则变量被视为字符数组而不是字符串。

    正如在另一个答案中给出的那样,对密钥进行清理可以是另一种选择。但我宁愿使用 foreach 这样做:

    foreach($array as $key=>$val){unset($array[$key]);$array[trim($key)] = $val;}
    echo $array['signature'];
    

    清理和分配不需要两个步骤。它合而为一。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多