不能有条件地将元素推入子数组——而是覆盖第一个字符


Cannot conditionally push element into subarray -- instead it overwrites first character

我有这段代码,如我所料:

$somearr['some']='value';
$arr[]="first";
$arr['first'][]=$somearr['some'];
echo "<br> Var dump of arr: " . var_dump($arr);

收益率:

array (size=2)
  0 => string 'first' (length=5)
  'first' => 
    array (size=1)
      0 => string 'value' (length=5)

完美。

现在尝试在我的项目中应用相同的原则(我假设):

function get_field_names($database, $table) {
    $show_statement = "DESCRIBE `" . $database . "`.`" . $table . "`";
    $column_result = mysql_query($show_statement);
    if (mysql_num_rows($column_result) > 0) {
        $f = 0;
        while ($row = mysql_fetch_assoc($column_result, MYSQL_ASSOC)) {
            $field_names[$f] = $row['Field'];
            if ($row['Key'] != "") {
                $field_names[$f][0] = $row['Key'];
            }
            $f++;
        }       
    }
    return $field_names;
}

但是,不是用$row['Key']的值为我的数组$field_names[$f][0]创建第二个维度,而是用$field_names[$f]字符串中的第一个字符覆盖$row['Key']字符串中的第一个字符,这样$field_names[$f]包含字符串:"field_name"在$row['Key'] == "PRI"$field_names[$f][0] = $row['Key']之后,我得到:"Pield_name"

我确信我误解了数组$row,但是我开始绕圈了。

这很容易通过重新访问原始示例来解释:

$arr[]="first";
$arr['first'][]=$somearr['some'];

这和你想的不一样。第一行没有创建一个新的数组键first。它只是给索引项[0]赋一个值。
然而,第二行将一个值赋给字母数字键[first]。这是$arr数组中的两个不同的子条目。

在第二个示例中,您正在覆盖值:

$field_names[$f] = 'string...';
$field_names[$f][0] = 'something else...';

[$f]键处只能有一个数组条目。不能与字符串和数组共享一个位置。

这里实际发生的是,第二行是给'string...'的第一个类似数组的索引赋值。它相当于另一种字符串索引语法:

$field_names[$f]{0} = 'something else...';
                 ^
                 |
                 Not an array index. Because a string was here first.

无论如何,您不能以字符串和键的形式共享条目。这就是整个故事。-我认为在array s下的手册中有粗略的解释

这是因为您可以将PHP中的任何字符串视为数组

$test = "Hello, World";
echo $test[0];

将导致"H"被回显。你在

中告诉你的代码
$field_names[$f][0] = $row['Key'];

将字符串$field_names[$f]中的第一个字符替换为$row['Key']。然而,由于我们要替换的只有1个字符PHP只使用$row['Key']中的第一个字符因此,您将得到"Pield_name", PRI中的"P"替换为"F"它位于"字符串数组"的第一个位置

我仍然不明白你想做什么。如果您可以在插入$row['Key']后映射出您希望数组的样子。我可以帮你写代码

编辑:top代码工作的原因是你没有为你添加到数组中的第一项指定键:

$arr[]="first"; //Inserts string "first" at pos 0 of array same as $arr[0]="first";
$arr['first'][]=$somearr['some']; //Inserts array into $arr using key 'first'
echo "<br> Var dump of arr: " . var_dump($arr);

同样可以用下面的代码

实现
$arr =array(
    0       => 'first',
    'first' => $somearr['some'] 
)