Php изтриване от масив по ключ. Използване на Free Pascal за обработка на масиви

Масивът е една от най-полезните и често използвани структури от данни във всеки език за програмиране. Много е важно и полезно да можете да управлявате масиви и техните елементи. В тази статия ще разгледаме как можете да премахнете отделни елементимасив в PHP.

Тази задача може да бъде реализирана различни методи, в зависимост от това какво знаем за премахнатия елемент – дали е известен ключът (номерът или идентификаторът на елемента в масива) или само неговата стойност.

Премахване на елемент в масив чрез неговия ключ

Ако знаете ключа на елемента, тогава задачата е много проста. Функция ненастроен ()ви позволява да изтриете елемент от масив или всяка променлива (използваната под променлива паметкомпютър).

Например имаме масив:

$ myArr = масив (1,2,3,4,5);

За да премахнете елемент със стойност "3", използвайте следния код:

unset ($ myArr);

Обърнете внимание, че не е посочена стойността (3), а ключът на елемента (2), започващ от в такъв случайот 0. Така че, ако трябва да изтриете първия елемент от масива, тогава посочваме нулевия елемент:

unset ($ myArr);

Също така си струва да се има предвид, че след нашите две изтривания, масивът вече съдържа три елемента:

масив
=> 2
=> 4
=> 5
)

Всички ключове на останалите елементи се запазват. Съответно, ако сега е необходимо да изтриете първия елемент, тогава ще е необходимо да посочите един като ключ. Следователно, както и защото не винаги знаем номера на елемента в масива, а само неговата стойност, тази опция може да не е подходяща.

Премахване на елемент от масива по стойност

Ако ключът на елемента не е известен, но е известна само стойността на масива, тогава ще трябва да повторите всички елементи на масива с цикъл и да изтриете желания от тях. Например, нека премахнем елемента със стойност "3":

$ myArr = масив (1,2,3,4,5);
foreach ($ myArr като $ ключ => $ елемент) (
ако ($ артикул == 3) (
unset ($ myArr [$ ключ]);
}
}

* Имайте предвид, че условието проверява за стойността на масива, налична в цикъла в променливата $ item, и при изтриване се посочва ключът на елемента ($ ключ променлива).

Този алгоритъм е подходящ и ако трябва да изтриете група елементи наведнъж. В крайна сметка има условие, което определя кои елементи да се изтрият.

Премахване на пресичащи се елементи на масива

Един от удобни средства PHP е способността да се получи масив от елементи, които не се пресичат с елементи от други масиви. За това се използва функцията array_diff(). Той приема масиви като параметри и връща нов масив. Например, има първоначален масив $ myArr, от който се нуждаем само от елементи, които не са включени в масива $ myArr2:

$ myArr = масив (1,2,3,4,5);
$ myArr2 = масив (3,4);

Чрез прилагане на функцията array_diff (), получаваме нов масив, съдържащ само необходимите елементи:

$ resArr = array_diff ($ myArr, myArr2);

В резултат на това $ resArr ще съдържа:

масив
=> 1
=> 2
=> 5
)

* Тук си струва да се обърне внимание на факта, че ключовете се запазват при създаване на нов масив. Освен това си струва да знаете, че селекцията идва само от първия масив. Така че, ако има други уникални елементи в $ myArr2, например "6" или "7", това няма да повлияе на резултата по никакъв начин - те няма да бъдат добавени към новия масив.

Този проблем може да бъде решен по няколко начина.

Метод 1. Копирайте в друг масив просто не дори елементи.

const N = 20; var a, b: масив [1 .. N] от цяло число; i, m: байт; започнете рандомизиране; за i: = 1 до N започват [i]: = произволно (40) + 10; напишете (a [i]: 3); край; записване; m: = 0; за i: = 1 до N направи, ако [i] mod 2<>0 след това започва m: = m + 1; b [m]: = a [i]; край; за i: = 1 до m започнете да пишете (b [i]: 3); край; записване; край.

Това е най-лесният начин да премахнете елементи от масив (в този случай четни числа), тъй като не е необходимо да компресирате оригиналния масив. В решението на проблема, представен по-горе, променливата m съхранява броя на намерените нечетни елементи и в същото време, когато попълва втория масив, е променящият се индекс на елементите.

Метод 2. Изтрийте четни елементи в текущия масив, като ги презапишете с нечетни вдясно.

const N = 10; var a: масив [1 .. N] от цяло число; i, k, m: байт; започнете рандомизиране; за i: = 1 до N започват [i]: = произволно (40) + 10; напишете (a [i]: 3) край; записване; i: = 1; m: = N; докато аз<= m do if a[ i] mod 2 = 0 then begin m : = m- 1 ; for k: = i to m do a[ k] : = a[ k+ 1 ] ; end else i : = i+ 1 ; for i: = 1 to m do write (a[ i] : 3 ) ; writeln ; end .

Този начин за решаване на проблема е по-сложен. Тук, ако се срещне четен елемент, тогава целият остатък от масива се измества с една клетка напред. В този случай намереният четен елемент се презаписва. Променливата m намалява, когато броят на елементите в масива става по-малък.

Този метод трябва да се счита за най-рационален (въпреки това в училищния курс отворените масиви може да не се изучават). В предишните версии всъщност масивите не бяха намалени, а само част от масива се показваше на екрана. Би било възможно просто да се повтори оригиналния масив, да не се прави нищо с него и да се показват само странни елементи на екрана.

Отвореният масив ви позволява да промените дължината му. При решението на задачата по-долу, след като нечетните елементи бъдат изместени и нечетните бъдат „презаписани“, дължината на масива се променя (като се използва процедурата за определяне на дължината). Той задава новата дължина на масива. Особеността на отворените масиви в Pascal е, че тяхното индексиране започва от нула.

const N = 10; var a: масив от цяло число; i, j, m: байт; започнете рандомизиране; SetLength (a, N); за i: = 0 до N- 1 започват a [i]: = произволно (40) + 10; напишете (a [i]: 3); край; записване; i: = 0; // индекс на първия елемент m: = n- 1; // индекс на последниядокато аз<= m do if a[ i] mod 2 = 0 then begin for j : = i to m- 1 do a[ j] : = a[ j+ 1 ] ; m : = m - 1 end else i : = i + 1 ; SetLength(a, m+ 1 ) ; // последният елемент има индекс m, но има m + 1 елементаза i: = 0 до m напишете (a [i]: 3); записване; край.

Пример за изпълнение на програмния код.

Функции за работа с масиви и операции с масиви (част 2)

Обединяване на масиви

Сливането (свързването) на масиви е операцията по създаване на масив, състоящ се от елементите на няколко други масива. Обединяването на масиви е много опасна операция, тъй като резултатът от сливането се подчинява на собствената си логика, забравяйки за която можете да загубите данни. Сливането на масиви се осъществява с помощта на " + "или използване на функцията Сливането може да се извърши само с помощта на функцията array_merge ().

Да кажем, че имаме два масива:

$ A = масив ("1" => "Първи", "2" => "Втори");
$ B = масив ("3" => "Трети", "4" => "Четвърти");

Сега нека обединим тези два масива в един масив $ C:

Оператор " + "не е комутативно за масиви. Това означава, че $ A + $ Bне е равно $ B + $ A.

В резултат на разгледания пример ще получим масив $ Cот следната форма:

"1" => "Първи", "2" => "Втори", "3" => "Трети", "4" => "Четвърти"

И като резултат $ B + $ Aполучаваме масив като този:

"3" => "Трети", "4" => "Четвърти", "1" => "Първи", "2" => "Втори"

При сливане на списъци този метод не работи. Нека обясним даден фактНапример:

Да кажем, че имаме два масива:

$ A = масив (10,11,12);
$ B = масив (13,14,15);

В резултат на сливане на списъци $ Аи $ B ($ A + $ B) получаваме: 10,11,12. И това изобщо не е резултатът, който искахме да получим ... Това се дължи на факта, че при сливане на списъци със същите индекси, елемент от първия масив остава в получения масив и на същото място. В този случай трябва да използваме функцията

Пример за използване на функцията броя ():

$ arr = 5;
$ arr = 4;
$ arr = 8;
$ arr = 3;
$ arr = 8;
ехо "

Брой елементи на масива: "... брой ($ arr). "

" ;
// Изходи: Брой елементи на масива: 5
?>

Премахване на масив и неговите елементи

Ако искате да изтриете цял масив, използвайте функцията ненастроен () .

Ако искате да премахнете двойка ключ/стойност, можете също да използвате функцията ненастроен ()... Нека дадем конкретни примери:

$ arr = масив (5 => 1, 12 => 2);

$ arr = 56; // В този момент от скрипта това е
// еквивалентно на $ arr = 56;

$ arr ["x"] = 42; // Това добавя нов към масива
// елемент с ключ "x"
Форум за PHP портал. СУ

пето място - шесто.

X [3]: = X [4];

X [4]: ​​= X [5];

X [5]: = X [6];

По този начин всички елементи от третия до петия трябва да бъдат преместени наляво с един - на мястото на i -тия елемент трябва да напишете (i + 1) -ти. Блоковата схема на алгоритъма е показана на фиг. 5.25.


Ориз. 5.25.


Ориз. 5.26.


Ориз. 5.27.

Сега нека разгледаме един по-общ проблем: необходимо е да премахнете m-тия елемент от масива X, състоящ се от n елемента. За да направите това, достатъчно е да напишете елемент (m + 1) -ти на мястото на елемент с номер m, (m + 2) -ти елемент - на мястото на (m + 1) -ти и т.н., n - th елемент - на място (n – 1) th. Процесът на премахване на елемент от масив е показан на фиг. 5.26.

Алгоритъмът за премахване на елемент с номер m от масив X с размерност n е показан на фиг. 5.27.

След премахване на т.4 И всъщност изместване на част от масива с един елемент налявоот масива, броят на елементите в масива ще се промени (намали с едно) и индексът на някои от елементите ще се промени. Ако елемент е изтрит, на негово място идва следващият, няма нужда да се премествате към него (чрез увеличаване на индекса с един). Следващият елемент се премести наляво, след като беше премахнат.

Ако се обработва масив, в който някои от елементите са изтрити, то след изтриване на елемент не е необходимо да преминавате към следващия (това намалява броя на елементите). Разгледайте следния проблем като пример.

ПРОБЛЕМ 5.1. Премахнете отрицателните елементи от масива.

Алгоритъмът за решаване на проблема е доста прост: итерираме всички елементи на масива, ако елементът е отрицателен, тогава го изтриваме, като преместваме всички следващи по един наляво. Единственото нещо, което си струва да запомните, е, че след изтриване на елемент не е необходимо да преминавате към следващия за последваща обработка, той сам се премества на текущото място. Блок-схемата за решаване на проблем 5.1 е показана на фиг. 5.28.

По-долу е текстът на програмата с коментари.

програма upor_massiv; var i, n, j: байт; X: масив [1 .. 100] от реално; begin writeln ('въведете размера на масива'); readln (n); (Въвеждане на масив.) За i: = 1 до n започвайте запис (’X [’, i, ’] =’); readln (X [i]); край; writeln ('масив X'); за i: = 1 до n напишете (x [i]: 5: 2, ''); записване; i: = 1; докато аз<=n) do {Если очередной элемент массива X[i] отрицателен, то} if x [ i ]<0 then begin {удаляем элемент массива с номером i.} for j:= i to n_1 do x [ j ] : = x [ j + 1 ]; {Уменьшаем размер массива.} {Не надо переходить к следующему элементу массива.} n:=n -1; end else {Если элемент не удалялся, то переходим к следующему элементу массива.} i:= i +1; writeln (’Изменённый массив ’); for i:=1 to n do {Вывод преобразованного массива.} write (X[ i ] : 5: 2, ’ ’); writeln; end.


Ориз. 5.28.

Резултатите от програмата са показани на фиг. 5.29.


Ориз. 5.29.

5.9 Вмъкване на елемент в масив

Нека разгледаме една проста задача: вмъкнете числото b в масива X (10), между третия и четвъртия елемент.

За да се реши този проблем, е необходимо да се изместят всички елементи на масива, като се започне от четвъртия, надясно с един елемент. Тогава b (X: = b;) ще трябва да бъде записано в четвъртия елемент от масива. Но за да не загубите съседната стойност, първо трябва да изместите десетия елемент с един надясно, след това деветия, осмия и т.н. към четвъртия. Блоковата схема на алгоритъма за вмъкване е показана на фиг. 5.30.


Ориз. 5.30.

В общия случай блоковата схема за вмъкване на число b в масива X (N), между елементите, номерирани m и m + 1, е показана на фиг. 5.31.


Ориз. 5.31.

По-долу е даден програмен фрагмент, който реализира този алгоритъм 5 Когато се описва масив, е необходимо да се предвиди достатъчен размер за вмъкване на един елемент. .

var i, n, m: байт; X: масив [1 .. 100] от реално; б: истински; начало на запис ('N ='); readln (n); за i: = 1 до n започват да записват ('X [', i, '] ='); readln (X [i]); край; writeln ('Масив X'); за i: = 1 до n напишете (x [i]: 5: 2, ''); записване; writeln ('m ='); readln (m); writeln ('b ='); readln (b); за i: = n надолу до m + 1 do x [i +1]: = x [i]; x: = b; n: = n + 1; writeln ('Променен масив'); за i: = 1 до n напишете (X [i]: 5: 2, ''); записване; край.

5.10 Използване на рутинни процедури за работа с масиви

Нека видим как можете да предавате масиви към подпрограма. Както знаете (вижте Глава 4), за да декларирате променливи в списъка с формални параметри на подпрограма, трябва да посочите техните имена и типове. Въпреки това, типът на всеки параметър в списъка може да бъде само стандартен или предварително деклариран тип. Следователно, за да предадете масив на подпрограма, първо трябва да опишете неговия тип 6 Тип данни на масива, декларация на масив вижте раздел 2.4.9. Работата с масиви е описана подробно в тази глава.и след това декларирайте процедурата:

тип_масив = масив[index_list] натип;

процедура

име_на_процедура (име_на_масив: тип_масив);

Например:

тип вектор = масив [1 .. 10] от байт; matrica = масив [1 .. 3, 1 .. 3] от реално; процедура proc (A: матрица; b: вектор; var x: вектор);

Ясно е, че преминаването на низ от формата

име на променлива: низ[дължина_линия];

което всъщност е масив 7 Тип данни "string", за декларация на низ вижте раздел 2.4.9, трябва да се извърши по същия начин:

тип_ред = низ[дължина_линия];

процедура

име_на_процедура (име_на низ: тип_низ);

Например:

тип stroka_5 = низ [5]; stroka_10 = низ [1 0]; функция fun (S t r: stroka_5): stroka_10;

Масивите могат да се предават на подпрограма, използвайки концепцията за отворен масив. Отвореният масив е масив 8 Типът данни "масив", декларация на масив, достъп до масив, вижте раздел 2.4.9., в чието описание е посочен видът на елементите, от които се състои, но не са определени границите на промяната на индексите:

име на отворен_масив: масив от масив от...тип;

Например:

var massiv_1: масив от реални; massiv_2: масив от char; massiv_3: масив от масив от масив от байтове;

Разпределение на паметтаи определяне на границите на индексите