PHP многомерный массив - второе измерение перезаписывает первое значение - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть этот код, который работает, как я ожидаю:

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

}

Но вместо создания второго измерения в моем массиве $ field_names [$ f] [0] со значением $ row ['Key'] вместо первого символа в строке $ field_names [$ f] перезаписывается с первым символом в $ row ['Key'], так что $ field_names [$ f] содержит строку: "field_name", а после $ field_names [$ f] [0] = $ row ['Key'] где $ row [ 'Key'] == "PRI", я получаю: "Pield_name".

Я уверен, что неправильно понимаю массив $ row, но я начинаю ходить кругами. Пожалуйста, подожгите меня за мою глупость ... после того, как вы укажете на мою проблему. ТИА.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Это легко объяснить, вернувшись к исходному примеру:

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

1 голос
/ 19 декабря 2011

Это потому, что вы можете рассматривать любую строку в PHP как массив

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

В результате будет отображаться "H". То, что вы говорите, код в

$field_names[$f][0] = $row['Key'];

- заменить первый символ в строке $ field_names [$ f] на $ row ['Key']. Однако, поскольку мы заменяем PHP только на 1 символ, он просто использует первый символ в $ row ['Key'], таким образом, вы получаете «Pield_name», «P» из PRI заменил на «F», который был в первом позиция в «массиве строк» ​​

Я все еще не понимаю, что вы хотите сделать. Если бы вы могли отобразить, как вы хотите, чтобы массив выглядел после того, как вы вставили (?) $ Row ['Key']. Я могу помочь вам с кодом

EDIT: Причина, по которой ваш верхний код работает, заключается в том, что вы просто не указываете ключ для первого элемента, который вы добавляете в массив:

$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'] 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...