Який найпростіший спосіб створити 2d-масив. Я сподівався, що зможу зробити щось подібне до цього:
declare int d[0..m, 0..n]
Відповіді:
Ви також можете створити асоціативний масив або "хеш-таблицю", як масив, вказавши індекс масиву.
$array = array(
0 => array(
'name' => 'John Doe',
'email' => 'john@example.com'
),
1 => array(
'name' => 'Jane Doe',
'email' => 'jane@example.com'
),
);
Що еквівалентно
$array = array();
$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = 'john@example.com';
$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = 'jane@example.com';
Нижче наведено еквівалент і результат двовимірного масиву:
$array = array(
array(0, 1, 2),
array(3, 4, 5),
);
або
$array = array();
$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
Просто заявити? Не треба. Просто переконайтесь, що змінна існує:
$d = array();
Масиви змінюються динамічно, і намагається записати що-небудь у неіснуючий елемент, створює його (і створює цілий масив, якщо потрібно)
$d[1][2] = 3;
Це справедливо для будь-якої кількості розмірів без попередніх декларацій.
count
правильний вимір, наприклад count($d[1])
, якщо я не розумію твою думку?
По-перше, PHP не має багатовимірних масивів, він має масиви масивів.
По-друге, ви можете написати функцію, яка буде це робити:
function declare($m, $n, $value = 0) {
return array_fill(0, $m, array_fill(0, $n, $value));
}
Для простого рішення типу "заповнюй по ходу":
$foo = array(array());
Це дасть вам гнучкий псевдовимірний масив, який може вмістити $ foo [ n ] [ n ], де n <= ∞ (звичайно, ваш обмежений звичайними обмеженнями обсягу пам'яті, але ви отримуєте ідею, я сподіваюся). Теоретично це можна розширити, щоб створити стільки підмасивів, скільки вам потрібно.
Або для більших масивів, усі з однаковим значенням:
$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);
створить масив $m
by $n
з усім, що встановлено в $value
.
Наскільки мені відомо, для цього немає вбудованої функції php, вам потрібно це робити через цикл або за допомогою спеціального методу, який рекурсивно викликає щось на зразок array_fill, визначене у відповіді @Amber;
Я припускаю, що ви маєте на увазі створити порожній, але іціалізований масив масивів. Наприклад, вам потрібні остаточні результати, як показано нижче, з масиву з 3 масивів :
$final_array = array(array(), array(), array());
Це просто просто вручну кодувати, але для масиву довільного розміру, такого як масив із 3 масивів із 3 масивів, починає ставати складним для ініціалізації перед використанням:
$final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));
... тощо ...
Я отримую розчарування. Було б непогано мати простий спосіб оголосити ініціалізований масив масивів будь-якою глибиною для використання, не перевіряючи та не видаючи помилок.
Відповідь atli справді допомогла мені це зрозуміти. Ось приклад того, як здійснювати ітерацію через двовимірний масив. Цей зразок показує, як знайти значення для відомих імен масиву, а також foreach, де ви просто проходите всі поля, які ви там знайдете. Сподіваюся, це комусь допоможе.
$array = array(
0 => array(
'name' => 'John Doe',
'email' => 'john@example.com'
),
1 => array(
'name' => 'Jane Doe',
'email' => 'jane@example.com'
),
);
foreach ( $array as $groupid => $fields) {
echo "hi element ". $groupid . "\n";
echo ". name is ". $fields['name'] . "\n";
echo ". email is ". $fields['email'] . "\n";
$i = 0;
foreach ($fields as $field) {
echo ". field $i is ".$field . "\n";
$i++;
}
}
Виходи:
hi element 0
. name is John Doe
. email is john@example.com
. field 0 is John Doe
. field 1 is john@example.com
hi element 1
. name is Jane Doe
. email is jane@example.com
. field 0 is Jane Doe
. field 1 is jane@example.com
І для мене аргумент про те, чи повинен бути масив розрідженим чи ні, залежить від контексту.
Наприклад, якщо $ a [6] [9] не заповнено, це еквівалентно $ a [6] [9], заповнюваному, наприклад, "" або 0.
$r = array("arr1","arr2");
щоб повторити одиничний елемент масиву, слід написати:
echo $r[0];
echo $r[1];
результат буде: arr1 arr2
Якщо ви хочете швидко створити багатовимірний масив для простого значення за допомогою одного вкладиша, я б рекомендував використовувати цю бібліотеку масивів, щоб зробити це так:
$array = Arr::setNestedElement([], '1.2.3', 'value');
який буде виробляти
[
1 => [
2 => [
3 => 'value'
]
]
]
Ви можете спробувати це, але значення другого виміру будуть дорівнювати індексам:
$array = array_fill_keys(range(0,5), range(0,5));
трохи складніше для порожнього масиву:
$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));
Вам потрібно оголосити масив в іншому масиві.
$arr = array(array(content), array(content));
Приклад:
$arr = array(array(1,2,3), array(4,5,6));
Щоб отримати перший елемент із масиву, ви будете використовувати $arr[0][0]
це, як перший елемент із першого масиву з масиву.
$arr[1][0]
поверне перший елемент із другого масиву з масиву.