在一个索引数组中使用PHP关联数组

3

我有一个$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) 吗?你看到了什么? - u_mulder
额,不好意思,你的代码生成的数组格式不对。 - Hanky Panky
1
https://3v4l.org/NhXGD 可以使用 tabs 作为分隔符正常工作。请确保您字符串中的分隔符是制表符。 - u_mulder
这篇文章将帮助您解决问题:https://dev59.com/UGkw5IYBdhLWcg3w8O6o - Sweta Parmar
@SwetaParmar 我没有使用array_push()或array_values(),我是用的$array[] = ... - jeffbeene
显示剩余6条评论
2个回答

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]))都表明数组结构是正确的? - jeffbeene
好的,preg_split() 为什么比 explode() 更好呢?不幸的是,我使用的真实键名中有空格,所以这对我行不通 :/ - jeffbeene
我选择正则表达式分割,因为输入字符串可能会有所不同。如果它不变,并且始终具有完全相同的结构(即仅一个TAB字符),那么在您的情况下没有更好的替代方案。 - Constantin Galbenu
好的。不幸的是,由于键中有空格,我需要使用制表符作为分隔符。 - jeffbeene
那么你的代码应该可以工作。我也尝试了其他人提到的使用制表符的方法,它可以工作。请尝试使用以下输入字符串:$string = "Name\tHeight\tWeight\nJohn\t177\t142\nJill\t156\t123\nJacob\t183\t157"; - Constantin Galbenu
@jeffbeene 请看这里 http://sandbox.onlinephpfunctions.com/code/958fa6775f483025cfd3db15e87f24ade6d2c79c - Constantin Galbenu

0
//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'];

谢谢。现在,如果我想在数组键中使用空格怎么办?例如:“人名”而不是“名字”? - jeffbeene
如果你想使用 ["人名"] 这种类型的表头,那么从一开始就是错误的逻辑。我们需要使用不同的逻辑来爆炸 \n 会在单行中给你分隔空格的字符串。 - Afzal Patel
好的,谢谢。看起来我的问题并不是缺少字符串中的“\t”,但我不确定如何使用“\t”替换制表符,如果你能明白我的意思的话...请看我对问题的编辑。 - jeffbeene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接