Як оголосити двовимірний масив?


91

Який найпростіший спосіб створити 2d-масив. Я сподівався, що зможу зробити щось подібне до цього:

declare int d[0..m, 0..n]

Відповіді:


81

Ви також можете створити асоціативний масив або "хеш-таблицю", як масив, вказавши індекс масиву.

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

1
Як ми можемо створити цей самий масив, використовуючи циклічні оператори?
Anoop Pete

@ Anoop-Pete У ​​другому фрагменті два повторювані блоки будуть поміщені в цикл, а числовий індекс замінений змінною, яка збільшується на кожній ітерації.
Атлі

1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
Дакс

64

Нижче наведено еквівалент і результат двовимірного масиву:

$array = array(
    array(0, 1, 2),
    array(3, 4, 5),
);

або

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);

7
Вони не дають двовимірних масивів, а навпаки - масиву масивів.
dotancohen

5
@dotancohen Це насправді лише семантика. Практично ці два поняття однакові. Єдина різниця між тим, що там демонструється, та різновидом багатовимірних масивів, що використовуються в таких мовах, як С #, - це синтаксис. І досить мала різниця в синтаксисі при цьому.
Атлі,

1
Принаймні в C # вимоги до пам'яті різні. Масив масивів виділяє лише обсяг пам'яті, необхідний для кожного масиву. Двовимірний масив виділяє весь N * M пам'яті.
dotancohen

6
@dotancohen Вимоги до пам’яті між PHP та C # загалом дуже різні, оскільки час виконання кожної мови має свій власний спосіб обробки пам’яті. Як правило, це не те, чим ви займаєтесь на практиці. Тим не менше, якщо ви випадково не будуєте якусь тривалу, високопродуктивну програму, таку як гра, і в цьому випадку PHP буде дивним вибором мови.
Атлі

40

Просто заявити? Не треба. Просто переконайтесь, що змінна існує:

$d = array();

Масиви змінюються динамічно, і намагається записати що-небудь у неіснуючий елемент, створює його (і створює цілий масив, якщо потрібно)

$d[1][2] = 3;

Це справедливо для будь-якої кількості розмірів без попередніх декларацій.


3
За винятком того, що нічого не говорить про розміри. Якщо ви оголошуєте масив M x N 2D, швидше за все, це матриця, а якщо це матриця, то ви будете робити множення або щось на ньому, що вимагатиме перебору елементів, чого ви не можете зробити, якщо це "розріджений" і не знаю розміри.
cletus

@cletus: ти можеш просто використовувати countправильний вимір, наприклад count($d[1]), якщо я не розумію твою думку?
DisgruntledGoat

2
Тим не менше, PHP не має багатовимірних масивів. Завжди залишається можливість, що масив масивів може бути розрідженим. Отже, як щодо створення класу, який реалізує матрицю за допомогою масивів, принаймні тоді ви б більше подбали про належну реалізацію.
Дон

26

По-перше, PHP не має багатовимірних масивів, він має масиви масивів.

По-друге, ви можете написати функцію, яка буде це робити:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
Ви маєте в виду «масиви з масивів», замість «масивів або масивів»?
Асаф,

@Asaph: так, я зробив. Виправлено. Дякую.
cletus

1
Налаштування масиву нулів - абсолютно безглузда вправа. Вам не потрібно оголошувати масив, просто використовуйте його.
DisgruntledGoat

7
За винятком того, якщо вам потрібно виконати ітерацію над ним або визначити його розмір, як якщо ви скажете, що виконуєте множення матриць. Існує цілком дійсний випадок для заповнення значень масиву.
cletus

11

Для простого рішення типу "заповнюй по ходу":

$foo = array(array());

Це дасть вам гнучкий псевдовимірний масив, який може вмістити $ foo [ n ] [ n ], де n <= ∞ (звичайно, ваш обмежений звичайними обмеженнями обсягу пам'яті, але ви отримуєте ідею, я сподіваюся). Теоретично це можна розширити, щоб створити стільки підмасивів, скільки вам потрібно.


9

Або для більших масивів, усі з однаковим значенням:

$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);

створить масив $mby $nз усім, що встановлено в $value.


3

Наскільки мені відомо, для цього немає вбудованої функції 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()));

... тощо ...

Я отримую розчарування. Було б непогано мати простий спосіб оголосити ініціалізований масив масивів будь-якою глибиною для використання, не перевіряючи та не видаючи помилок.


3

Відповідь 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

2

І для мене аргумент про те, чи повинен бути масив розрідженим чи ні, залежить від контексту.

Наприклад, якщо $ a [6] [9] не заповнено, це еквівалентно $ a [6] [9], заповнюваному, наприклад, "" або 0.


2
$r = array("arr1","arr2");

щоб повторити одиничний елемент масиву, слід написати:

echo $r[0];
echo $r[1];

результат буде: arr1 arr2


2
Це одновимірний масив. Багатовимірний масив має принаймні масив усередині масиву.
Mike Stratton

2

І мені подобається такий спосіб:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );

0

Якщо ви хочете швидко створити багатовимірний масив для простого значення за допомогою одного вкладиша, я б рекомендував використовувати цю бібліотеку масивів, щоб зробити це так:

$array = Arr::setNestedElement([], '1.2.3', 'value');

який буде виробляти

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

Ви можете спробувати це, але значення другого виміру будуть дорівнювати індексам:

$array = array_fill_keys(range(0,5), range(0,5));

трохи складніше для порожнього масиву:

$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));


0

Вам потрібно оголосити масив в іншому масиві.

$arr = array(array(content), array(content));

Приклад:

$arr = array(array(1,2,3), array(4,5,6));

Щоб отримати перший елемент із масиву, ви будете використовувати $arr[0][0]це, як перший елемент із першого масиву з масиву. $arr[1][0]поверне перший елемент із другого масиву з масиву.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.