【问题标题】:PHP Associative Array in an Indexed Array索引数组中的 PHP 关联数组
【发布时间】:2017-03-15 06:52:04
【问题描述】:

我有一个$string

'Name   Height  Weight
 John   177     142
 Jill   156     123
 Jacob  183     157'

我正在把它变成如下结构的$array

Array (
    [0] => Array (
        ['Name'] => 'John'
        ['Height'] => '177'
        ['Weight'] => '142'
    )
    [1] = > Array (
        ['Name'] => 'Jill'
        ['Height'] => '156'
        ['Weight'] => '123'
    )
    [2] = > Array (
        ['Name'] => 'Jacob'
        ['Height'] => '183'
        ['Weight'] => '157'
    )
)

使用以下代码:

$rows = explode("\n",$string); //creates an indexed array of rows as strings
$headers = explode("\t",$rows[0]); //creates an indexed array of headers as strings
$rows = array_slice($rows,1); //removes headers from $rows
$array = Array();
foreach($rows as $row) {
    $array[] = array_combine($headers, explode("\t",$row)); //creates associative arrays for each row
}

但是,我无法访问索引 $array 内的关联数组

例如,这不起作用:

echo $array[0]['Name'];

即使echo implode(', ', array_keys($array[0])); 给出:

Name, Height, Weight

我尝试了许多不同的方法来访问索引数组中的关联数组,但都没有成功。我做错了什么?

编辑:

所以,

$string = "Name Height  Weight
John    177 142
Jill    156 123
Jacob‌​ 183 157";

不起作用,但是

$string = "Name\tHeight\tWeight\nJohn\t177\t142\nJill\t156\t123\nJacob‌​‌​\t183\t157";

确实...

所以我想问题是:有什么区别?我如何将前一个字符串解释为后者?

【问题讨论】:

  • print_r($array)了吗?你看到了什么?
  • Ermm 不,您的代码生成的数组没有那种格式
  • @u_mulder 是的,我看到了上面提到的数组结构(不包括单引号)
  • @HankyPanky 为什么 print_r() 和 var_dump() 显示的结构是这样的?
  • 3v4l.org/NhXGDtabs 作为分隔符可以正常工作。确保字符串中的分隔符是制表符。

标签: php arrays associative-array


【解决方案1】:

您的代码不会生成该数组结构,但可以这样修复:

$string = 'Name   Height  Weight
 John   177     142
 Jill   156     123
 Jacob  183     157';

$rows = explode("\n",$string); //creates an indexed array of rows as strings

$headers = preg_split("#\s+#",trim($rows[0], "\n\r\t ")); //creates an indexed array of headers as strings, by splitting by any white space
var_dump($headers);

$rows = array_slice($rows,1); //removes headers from $rows
$array = Array();
foreach($rows as $row) {
    $array[] = array_combine($headers, preg_split("#\s+#",trim($row, "\n\r\t "))); //creates associative arrays for each row, by splitting by any white space
}

var_dump($array);

这会产生输出:

array(3) {
  [0]=>
  string(4) "Name"
  [1]=>
  string(6) "Height"
  [2]=>
  string(6) "Weight"
}
array(3) {
  [0]=>
  array(3) {
    ["Name"]=>
    string(4) "John"
    ["Height"]=>
    string(3) "177"
    ["Weight"]=>
    string(3) "142"
  }
  [1]=>
  array(3) {
    ["Name"]=>
    string(4) "Jill"
    ["Height"]=>
    string(3) "156"
    ["Weight"]=>
    string(3) "123"
  }
  [2]=>
  array(3) {
    ["Name"]=>
    string(5) "Jacob"
    ["Height"]=>
    string(3) "183"
    ["Weight"]=>
    string(3) "157"
  }
}

主要思想是你必须用任何额外的空格修剪每一行字符串,并用最长的空格序列分割。

【讨论】:

  • 谢谢。给我一点时间来解决这个问题。同时,知道为什么 print_r()、var_dump() 和 implode(', ', array_keys($array[0])) 都表明数组结构是正确的吗?
  • 好的,为什么 preg_split() 比 explode() 更好?不幸的是,我使用的真实键中有空格,所以这对我不起作用:/
  • 我选择了正则表达式拆分,因为输入字符串可以变化。如果它没有变化,并且始终具有完全相同的结构(即只有一个 TAB 字符),那么在您的情况下不是更好的选择。
  • 好的。不幸的是,我需要使用制表符作为分隔符,因为键中有空格。
  • 那么你的代码应该可以工作了。正如其他人所说,我也使用标签进行了测试,并且有效。试试这个输入字符串:$string = "Name\tHeight\tWeight\nJohn\t177\t142\nJill\t156\t123\nJacob\t183\t157";
【解决方案2】:
//Use following code it will work as your answer 
$string='Name   Height  Weight
 John   177     142
 Jill   156     123
 Jacob  183     157';

 $rows = explode("\n",$string); //creates an indexed array of rows as strings

$headers = explode("\t",$rows[0]); //creates an indexed array of headers as strings

$headers=array_filter(explode(" ",$headers[0])); ///t convert to space and filter remove empty element

$rows = array_slice($rows,1); //removes headers from $rows

$array = Array();
foreach($rows as $row) {
    $row=explode("\t",$row);
    $row=array_filter(explode(" ",$row[0]));

    $array[] = array_combine($headers,$row); //creates associative arrays for each row
}

//print_r($array);
echo $array[0]['Name'];

【讨论】:

  • 谢谢。现在,如果我想要数组键中有空格怎么办?例如:“人名”而不是“姓名”
  • 如果你想使用那种类型的标题 ["Person's Name"] 那么逻辑从一开始就是错误的。我们需要使用不同的逻辑,因为explode \n 会在单行中为您提供空格分隔的字符串。
  • 好的,谢谢。看来我的问题是字符串中没有\t,但我不确定如何用\t“替换”标签,如果这有意义的话......请参阅我的问题的编辑。
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多