繁体   English   中英

访问PHP数组中的某些键值

[英]Access Certain Key Value in PHP Array

我是PHP新手,感到困惑,我写了一个PHP脚本来记录用户发出请求时的服务器环境变量,我的代码如下所示:

<?php
$req_dump = print_r($_SERVER, TRUE);
$fp = fopen('/tmp/request.log', 'a');
fwrite($fp, $req_dump);
fclose($fp);
echo "hello world";

但是,输出如下所示:

Array
(
    [HTTP_USER_AGENT] => anaconda/13.21.195
    [HTTP_HOST] => 10.0.188.97
    [HTTP_ACCEPT] => */*
    [HTTP_X_ANACONDA_ARCHITECTURE] => x86_64
    [HTTP_X_ANACONDA_SYSTEM_RELEASE] => Red Hat Enterprise Linux
    [HTTP_X_RHN_PROVISIONING_MAC_0] => eth0 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_1] => eth1 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_2] => eth2 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_3] => eth3 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_4] => eth4 00:02:C9:4F:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_5] => eth5 00:02:C9:4F:xx:xx
    [PATH] => /sbin:/usr/sbin:/bin:/usr/bin
    [SERVER_SIGNATURE] => <address>Apache/2.2.15 (Red Hat) Server at 10.0.188.97 Port 80</address>

    [SERVER_SOFTWARE] => Apache/2.2.15 (Red Hat)
    [SERVER_NAME] => 10.0.188.97
    [SERVER_ADDR] => 10.0.188.97
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 10.0.188.212
    [DOCUMENT_ROOT] => /var/www/html
    [SERVER_ADMIN] => root@localhost
    [SCRIPT_FILENAME] => /var/www/html/ks.php
    [REMOTE_PORT] => 59188
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /ks.php/images/install.img
    [SCRIPT_NAME] => /ks.php
    [PATH_INFO] => /images/install.img
    [PATH_TRANSLATED] => /var/www/html/images/install.img
    [PHP_SELF] => /ks.php/images/install.img
    [REQUEST_TIME] => 1402439673
)

我如何尝试访问数组:

仅供参考,以下是我尝试访问该数组的代码:

# ks.php
<?php
$Table = array(
"00:02:C9:10:aa:bb" => "10.0.188.91",
"00:02:C9:4F:aa:bb" => "10.0.188.92",
"00:02:C9:53:aa:bb" => "10.0.188.93",
"00:02:C9:56:aa:bb" => "10.0.188.94",
"00:02:C9:53:aa:bb" => "10.0.188.95",
"00:02:C9:4E:aa:bb" => "10.0.188.96",
"00:02:C9:5A:aa:bb" => "10.0.188.97",
);

?>
...
%post
...
printf 'DEVICE=eth4 \nIPADDR=<?php echo $Table[$_SERVER["HTTP_X_RHN_PROVISIONING_MAC_4"]]; ?>' > /etc/sysconfig/network-scripts/ifcfg-eth4 
service network restart
...
%end

输出对我来说似乎并不直接。 假设我要获取ethernet4的MAC地址,而$_SERVER["HTTP_X_RHN_PROVISIONING_MAC_4"]对我不起作用。 谁能帮我解释一下如何在PHP中实现该目标?

您的$_SERVER['HTTP_X_RHN_PROVISIONING_MAC_4']输出为eth4 00:02:C9:4F:xx:xx ,它也带有前缀eth4,其中,因为您的$Table具有00:02:C9:4F:aa:bb ,这会使密钥不匹配实际上,您正在尝试获取$Table['eth4 00:02:C9:4F:xx:xx'] ,该$Table$Table数组中不存在

尝试这个:

// We are splitting the mac address by space so that $macAddress contains '00:02:C9:4F:xx:xx' and $eth contains eth4 

list($eth,$macAddress) = explode(' ',$_SERVER['HTTP_X_RHN_PROVISIONING_MAC_4']);

// Make sure the value in $macAddress => 00:02:C9:4F:xx:xx is 00:02:C9:4F:aa:bb or change your array accordingly


$Table = array(
"00:02:C9:10:aa:bb" => "10.0.188.91",
"00:02:C9:4F:aa:bb" => "10.0.188.92",
"00:02:C9:53:aa:bb" => "10.0.188.93",
"00:02:C9:56:aa:bb" => "10.0.188.94",
"00:02:C9:53:aa:bb" => "10.0.188.95",
"00:02:C9:4E:aa:bb" => "10.0.188.96",
"00:02:C9:5A:aa:bb" => "10.0.188.97",
);

$finalAddress = $Table[$macAddress]; 

printf 'DEVICE=eth4 \nIPADDR=<?php echo $finalAddress ; ?>' > /etc/sysconfig/network-scripts/ifcfg-eth4 '

如果只保存数组,它会变成无用的打印输出。 要使其可访问,请在保存时使用json_encode

$fp = fopen('/tmp/request.log', 'w');
fwrite($fp, json_encode($_SERVER));
fclose($fp);

请注意我是如何删除print_r因为对于像这样的任务来说是不必要的。 我还更改了fopen以使用w而不是a覆盖文件,因此保存的JSON有效。

然后,当您打开文件时,只需使用json_decode像这样:

$server_variables_json = file_get_contents('/tmp/request.log');
$server_variables = json_decode($server_variables_json , true);

然后$server_variables是一个实际的数组,您可以像这样操作:

if (array_key_exists('HTTP_X_RHN_PROVISIONING_MAC_4', $server_variables)) {
  echo $server_variables['HTTP_X_RHN_PROVISIONING_MAC_4'];
}

我使用了if (array_key_exists(…))来帮助我在计算机上本地调试,因为我的$_SERVER值中没有设置HTTP_X_RHN_PROVISIONING_MAC_4

我在本地进行了一个简单的调试调试检查(因为我的设置中没有HTTP_X_RHN_PROVISIONING_MAC_4 ,只是为了获得HTTP_HOST如下所示:

if (array_key_exists('HTTP_HOST', $server_variables)) {
  echo $server_variables['HTTP_HOST'];
}

您需要使用引号来标识非数字索引:

echo $_SERVER['HTTP_X_RHN_PROVISIONING_MAC_4'];

您可以从文档本身获取更多基本信息

编辑:我不确定你的意思是:

<?php
    $array=array(
        'HTTP_X_RHN_PROVISIONING_MAC_0' => 'eth0 B4:99:BA:07:xx:xx',
        'HTTP_X_RHN_PROVISIONING_MAC_1' => 'eth1 B4:99:BA:07:xx:xx',
        'HTTP_X_RHN_PROVISIONING_MAC_2' => 'eth2 B4:99:BA:07:xx:xx',
        'HTTP_X_RHN_PROVISIONING_MAC_3' => 'eth3 B4:99:BA:07:xx:xx',
        'HTTP_X_RHN_PROVISIONING_MAC_4' => 'eth4 00:02:C9:4F:xx:xx',
        'HTTP_X_RHN_PROVISIONING_MAC_5' => 'eth5 00:02:C9:4F:xx:xx'
    );
    echo "Printing just a single element.\r\n";
    echo $array['HTTP_X_RHN_PROVISIONING_MAC_4'];

    echo "Printing the whole variable:\r\n";
    print_r($array);
?>

输出以下内容:

Printing just a single element.
eth4 00:02:C9:4F:xx:xx
Printing the whole variable:
Array
(
    [HTTP_X_RHN_PROVISIONING_MAC_0] => eth0 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_1] => eth1 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_2] => eth2 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_3] => eth3 B4:99:BA:07:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_4] => eth4 00:02:C9:4F:xx:xx
    [HTTP_X_RHN_PROVISIONING_MAC_5] => eth5 00:02:C9:4F:xx:xx
)

如果要放置var $ _SERVER [“ HTTP_X_RHN_PROVISIONING_MAC_4”],请不要忘记引号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM