【问题标题】:Cannot conditionally push element into subarray -- instead it overwrites first character不能有条件地将元素推入子数组——而是覆盖第一个字符
【发布时间】:2011-12-19 05:09:58
【问题描述】:

我的代码可以按我的预期工作:

$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”,在 $field_names[$f][0] = $row['Key'] 之后,$row['Key'] == "PRI",我得到:“Pield_name”。

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

【问题讨论】:

  • 此问题缺少所需的输出。

标签: php multidimensional-array types


【解决方案1】:

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

$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.

无论如何,您不能将条目共享为字符串和键。这就是整个故事。 - 我认为它在arrays 下的手册某处进行了粗略的解释。

【讨论】:

  • 乔希,谢谢。你的解释很有帮助。我得出的结论是,您所描述的事情正在发生,但不知道为什么。所以我想要的是构建一个二维数组,保存列名,$row['Field'] 的值,然后在第二维,$row['Key'] 的值,这样我就有:array(" Field"=>"column_one",array(0=> "PRI")) 其中键测试为主键。我想这似乎是要做的事情,因为表中的所有列都包含在此数组中,作为条目“字段”的多行,其中“键”列包含主键的 PRI。
  • 乔希,感谢您帮助我思考这个问题。自从我编码以来已经好几年了,我的脑海里似乎有一些损坏的数据..
【解决方案2】:

这是因为您可以将 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'] 之后绘制出您希望数组的样子。我可以帮你写代码

编辑: 您顶部代码工作的原因是您根本没有为添加到数组中的第一项指定键:

$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'] 
)

【讨论】:

  • 乔希,谢谢。你的解释很有帮助。我得出的结论是,您所描述的事情正在发生,但不知道为什么。所以我想要的是构建一个二维数组,保存列名,$row['Field'] 的值,然后在第二维,$row['Key'] 的值,这样我就有:
  • @user1105258 你能完成这个想法吗?我想你在给我代码 sn-p 之前按了 enter 键,说明你希望二维数组的外观
  • 乔希,也许我没有看到这里的森林。我的目标是返回包含给定表中所有字段的 $field_names 数组,并指示哪些字段是主键。是不是太复杂了?
  • 哇!我从愚蠢中恢复过来。我现在有:$field_names[$f] = array ($row['Field'], $row['Key']);并拥有我想要的:array (size=142) 0 => array (size=2) 0 => string 'nation_id' (length=9) 1 => string 'PRI' (length=3)
  • 哈哈,这发生在我们最好的人身上,很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 2019-06-01
  • 2023-03-11
  • 2015-10-07
  • 1970-01-01
  • 2023-02-04
  • 2018-06-12
  • 1970-01-01
相关资源
最近更新 更多