未排序的数组,headers_list(),为数组创建键?

时间:2010-12-17 22:34:31

标签: php arrays http-headers

如您所知,headers_list() - PHP函数返回如下数组:

Array
(
    [0] => Content-type: text/html; charset=utf-8
    [1] => key: value
    [2] => key2: value2
)

一般情况下(或者使用此示例),如何使用数组值中的“键”构建新数组?例如,上面的数组变为:

Array
(
    ['Content-type'] => text/html; charset=utf-8
    ['key'] => value
    ['key2'] => value2
)

这可能是非常基本的,但我还是初学者:)

6 个答案:

答案 0 :(得分:2)

您应该使用此函数apache_response_headers,而是返回数组中的标题...

但是,函数名称公开它仅适用于apache

更新:PHP需要使用--with-apxs2

进行编译

答案 1 :(得分:1)

这应该有效:

$headers = header_list();
foreach($headers as $header){
    // split each header by ':' and assign them to $key and $value
    list($key, $value) = explode(':', $header, 2); // limit the explode to 2 items. 
    // add trimed variables to the new array
    $new_headers[trim($key)] = trim($value);
}

$key的修剪可能不是很重要,但实际上是值,因为你会删除':'之后的空格。

答案 2 :(得分:1)

foreach($headers as $v) {
    list($name,$val) = explode(': ',$v);
    $newArray[$name] = $val;
}

// $newArray is your requested array.

答案 3 :(得分:1)

$headers = header_list();
$keyed_headers = array();
foreach ($headers as $header) {
    $break = explode(': ', $header, 2);
    $keyed_headers[$break[0]] = $break[1];
}

<强>更新

一时兴起,我决定使用类来解决这个问题 MoarAwesome TM 。这就是结果:

// definition
class HeaderArray extends ArrayObject {
    static function init() {
        return new self(header_list());
    }
    public function get_assoc() {
        $result = new self();
        foreach ($this as $v) {
            $b = explode(': ', $v, 2);
            $result[$b[0]] = $b[1];
        }
        return $result;
    }
}

// implementation
$headers = HeaderArray::init()->get_assoc();

答案 4 :(得分:1)

以下函数能够处理具有相同字段名称的多个标题字段并将它们组合as stipulated by the specification

  

当且仅当该标题字段的整个字段值被定义为以逗号分隔的列表[即#(值)]时,具有相同字段名称的多个消息标题字段可以出现在消息中。必须可以将多个头字段组合成一个“字段名:字段 - 值”对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段,每个字段值用逗号分隔。

function getHeaderFields() {
    $fields = array();
    $index = array();
    foreach (headers_list() as $field) {
        list($name, $value) = explode(':', $field, 2);
        $name = trim($name);
        if (isset($index[strtolower($name)])) {
            $name = $index[strtolower($name)];
        } else {
            $index[strtolower($name)] = $name;
        }
        if (isset($fields[$name])) {
            $fields[$name] .= ', '.trim($value);
        } else {
            $fields[$name] = trim($value);
        }
    }
    return $fields;
}

这与apache_response_headers或其他提到的解决方案相反:

setcookie('foo', 'bar');
setcookie('bar', 'quux');
$headers = getHeaderFields();
var_dump($headers['Set-Cookie']);      // string(17) "foo=bar, bar=quux"
$headers = apache_response_headers();
var_dump($headers['Set-Cookie']);      //  string(8) "bar=quux"

答案 5 :(得分:1)

我认为这样做会更好:如果有以下情况,你应该重新利用其余部分:&#39;在值

$hList = headers_list();

    foreach ($hList as $header) {
        $header = explode(":", $header);
        $headers[ array_shift($header) ] = trim( implode(":", $header) );
    }