[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Параллельная работа с двумя и более массивами
LRCenter
Допустим есть 3 массива - $patches[] $filles[] и $exts[], в одном соответственно хранятся пути к файлу, во втором файлы а в третьем разрешения к ним.

Как можно объеденить все значения циклом в виде $all[]="$patches[]/$filles[].$exts[]";

foreach же позволяет работать только с одним массивом за раз?



Спустя 13 минут, 56 секунд (13.07.2010 - 08:09) vagrand написал(а):
Ну если порядок следования в них данных одинаков, т.е. одинаковы индексы для соответствующих значений, то так:


$all = array();
foreach ($patches as $index => $path) {
$all[] = $path . '/' . $files[$index] . '/' . $exts[$index];
}

Спустя 1 час, 49 минут, 56 секунд (13.07.2010 - 09:59) sergeiss написал(а):
В такой ситуации лучше всего изменить сам подход! "Параллельные" массивы - суть зло smile.gif Лучше сделать объект, в котором хранить данные, относящиеся к чему-то одному. И сделать массив таких объектов.
То есть, делаешь класс, в котором основное - это свойства. Можно и функцию сделать, например конструктор, для данные сразу же при создании записывать.

И потом уже не важно даже, какие будут индексы, цифровые или символьные - ты сможешь пройти по массиву одним циклом. Сможешь удалить ненужные данные (один элемент) всего за одно действие.

Короче говоря - удобнее намного.

Спустя 1 час, 28 минут, 54 секунды (13.07.2010 - 11:28) vagrand написал(а):
Цитата
В такой ситуации лучше всего изменить сам подход! "Параллельные" массивы - суть зло smile.gif Лучше сделать объект, в котором хранить данные, относящиеся к чему-то одному. И сделать массив таких объектов.


В таком случае уже лучше сделать массив массивов, например:


$info = array(
array(
'path' => '...',
'file' => '...',
'ext' => '...'
),
...

array(
'path' => '...',
'file' => '...',
'ext' => '...'
)
);



Меньше памяти будет занимать и быстрее создаваться будет.

Спустя 5 минут, 26 секунд (13.07.2010 - 11:33) sergeiss написал(а):
vagrand - всё равно это параллельные массивы, не важно, что ты их запаковываешь внутрь некоего общего массива!!! Всё равно надо получить целостность данных, чтобы случайно не удалить данные из одного массива, оставив их в другом.
То есть, суть не меняется.

Спустя 15 минут, 40 секунд (13.07.2010 - 11:49) sergeiss написал(а):
В качестве пример таких параллельных массивов могу привести свою же работу на графическом конкурсе http://phpforum.ru/index.php?showtopic=28500.
Там есть ссылка на текст (архив). И вот там, в файле functions.php есть класс one_point, описывающий одну точку. А в классе graph_info уже используется массив этих точек, представителей класса one_point.
Ну и, естественно, этот массив используется потом при работе скрипта.

Этот пример - как раз то, о чем идет речь в теме.

Экскузи муа, не сразу вспомнил об этом примере, хотя "в голове какая-то мысль крутилась" wink.gif

Спустя 2 часа, 23 минуты, 10 секунд (13.07.2010 - 14:12) vagrand написал(а):
Цитата
vagrand - всё равно это параллельные массивы, не важно, что ты их запаковываешь внутрь некоего общего массива!!!


С чего это ты взял что они параллельные?

Цитата
Всё равно надо получить целостность данных, чтобы случайно не удалить данные из одного массива, оставив их в другом.


Я не вижу принципиальной разницы между массивом объектов и массивом ассоциативных массивов в данном конкретном случае. Единственное отличие в том что мой способ будет быстрее и меньше памяти сожрет, особенно при больших объемах.

Спустя 15 минут, 14 секунд (13.07.2010 - 14:27) sergeiss написал(а):
Цитата (vagrand @ 13.07.2010 - 15:12)
С чего это ты взял что они параллельные?

Под этим словом я подразумеваю массивы, которые находятся где-то рядом друг с другом, в нашем логическом представлении. Но при этом они никак не связаны между собой. То есть, удаление элемента из одного массива НЕ ПРИВОДИТ к автоматическому удалению соответствующего ему элемента из другого массива (или других массивов).
Вот твой случай:

$info = array(
array(
'path' => '...',
'file' => '...',
'ext' => '...'
),
...

array(
'path' => '...',
'file' => '...',
'ext' => '...'
)
);

Если ты удалишь из одного из вложенных массивов элемент 'path', то у тебя что - автоматически удалится 'path' из другого? Нет, не удалится. А если надо будет добавить новый элемент 'size' - он может быть добавлен одним простым действием во все массивы? Нет, не может.
Ты должен предусмотреть какие-то механизмы для этого. Например, функции отдельные.

И рассмотрим другой вариант, предложенный для критики автором темы:

$patches=array(...);
$filles=array(...);
$exts=array(...);

Чем он принципиально отличается от твоего? Да ничем!!! Точно также надо обеспечивать целостность и согласованность данных.

Если же используем массив объектов, то целостность данных обеспечивается легко и просто, "одной левой ногой".

Спустя 29 минут, 25 секунд (13.07.2010 - 14:57) vagrand написал(а):
Цитата
Если ты удалишь из одного из вложенных массивов элемент 'path', то у тебя что - автоматически удалится 'path' из другого? Нет, не удалится.


Либо я дурак и чето не понимаю либо я чего-то не понимаю. Ты хочешь сказать что в случае с массивом объектов при обнулении филда path у одного объекта автоматически обнулится и у какого-то другого?!

Цитата
А если надо будет добавить новый элемент 'size' - он может быть добавлен одним простым действием во все массивы? Нет, не может.


Хочешь сказать, что элемент size может быть легко добавлен ко всем экземплярам класса в случае с массивом объектов?! Интересно как, лучше на примере. Бо может я не знаю какой-то полезной функциональности у php ООП.

Цитата
Чем он принципиально отличается от твоего? Да ничем!!! Точно также надо обеспечивать целостность и согласованность данных.


Очень и очень они отличаются, в примере автора нужно следить за соответствием индексов в разных массивах, а у меня не нужно, т.к. данные уже сгруппированы.

Еще раз повторюсь, что я не вижу никакого выигрыша твоего метода в данном конкретном случае, а совсем даже наоборот, я вижу только одни минусы в быстродействии и количестве памяти.

ООП это хорошо там де оно нужно, но не следует его пихать туда где можно обойтись без него.

Спустя 47 минут, 49 секунд (13.07.2010 - 15:45) sergeiss написал(а):
vagrand - я не пойму - ты прикидываешься, прикалываешься или читать не умеешь? Вроде бы не глупый человек, а "гонишь пургу".

Вот смотри. Возьмём пример из моей же ссылки, из моего же кода и чуть его упростим-дополним.

// класс описывает одну точку
class one_point
{
public $x;
public $y;

function __construct( $x, $y) { $this->x=$x; $this->y=$y; }
}


// где-то тут был на введен массив $ini_info

$c=count( $int_info );
$points=array();
for( $i=0; $i<$c; $i+=2)
$points[]=new one_point( $ini_info[$i], $ini_info[$i+1] );
}


Краткое описание:
Одномерный массив $ini_info содержит данные в виде пар координат X и Y, которые как раз и преобразуются в массив объектов...
А именно, берём 2 последовательных элемента массива, и передаём их в конструктор класса one_point. При этом создается один экземпляр этого класса (объект), содержащий 2 параметра, $x и $y. Далее берём следующие 2 элемента массива $ini_info и повторяем всю процедуру. На этом шаге создается второй элемент массива объектов, содержащий, опять же, 2 параметра $x и $y, но только уже свои собственные. И так далее, пока не будут исчерпаны все элементы исходного массива.
В результате у нас есть массив объектов $points.

И вот уже на этом этапе получаем то самое преимущество, о котором я говорил. Мы имеем массив объектов. Мы можем удалить любой из элементов массива $points ( unset($points[4], например), при этом будут удалены ОБЕ координаты. Но мы не затронем координаты других точек, т.е. данные в других объектах.

Мы можем добавить новые точки. Старые данные также не будут затронуты. Мы даже можем перетасовать объекты, как и элементы любого другого массива, при этом мы будем работать только с массивом $points. Координаты каждой точки будут оставаться взаимосвязанными. Не будет 2-х "параллельных" массивов "ИКС" и "ИГРЕК", а будет один массив ТОЧКИ.

А что нам мешает усложнить описание, добавить 3-й элемент в класс one_point, например, некоторое описание? Да ничто не мешает!
class one_point 
{
public $x;
public $y;
public $name;

function __construct( $x, $y, $name) { $this->x=$x; $this->y=$y; $this->name=$name; }
}


// тогда при создании точки мы можем написать что-то типа
$points[]=new one_point( 4, 5, 'initial point');

И эта третья часть также будет единой частью неделимого объекта... Всё сказанное ранее о целостности данных будет справедливо и для этого объекта. Что мешает наращивать и усложнять структуру? Ничто smile.gif Только если здравый смысл, чтоб не перемудрить.

PS. И это даже не ООП, а так, "детский лепет ООП"; простое использование классов как контейнеров для данных. Не знаю насчет скорости, ловить 10е-5 секунды я не собираюсь. Но если мне удобнее работать с объектами, а не с кучей "параллельных" (взаимосвязанных) массивов, то я так и буду работать. И буду это рекомендовать другим.

Спустя 11 минут, 9 секунд (13.07.2010 - 15:56) linker написал(а):
Да что вы так кипятитесь, если есть 100% уверенность в том, что элементы массива совпадают, то нечего тут городить ООП и прочее, делается как написал vagrand

Спустя 3 минуты, 39 секунд (13.07.2010 - 15:59) Wird_34 написал(а):
Удаление в случае с массивом работает по тому же принципу:
unset($array[<индекс нужного элемента>]);


А для создания массива массивов можно написать функцию которая будет создавать массив:
function CreateNeedArray($x, $y) {
return array('x' => $x, 'y' => $y);
}


И будет тоже самое. Так же не вижу смысла в применении в данном случае ООП.

Спустя 5 минут, 22 секунды (13.07.2010 - 16:05) sergeiss написал(а):
А я как раз и веду речь о том, что даже думать не надо будет на тему "что элементы массива совпадают" smile.gif Да и другие "фенечки" автоматически появляются.
Кстати говоря, программисты, "познавшие Си" wink.gif, вполне могут узнать в показанном мной выше коде Сишный подход. И почему бы не использовать то, что себя зарекомендовало только с лучшей стороны?

Спустя 4 минуты, 6 секунд (13.07.2010 - 16:09) Wird_34 написал(а):
Цитата (sergeiss @ 13.07.2010 - 13:05)
Кстати говоря, программисты, "познавшие Си" wink.gif, вполне могут узнать в показанном мной выше коде Сишный подход. И почему бы не использовать то, что себя зарекомендовало только с лучшей стороны?

В C есть структуры, которые бы и использовались в данном случае, в PHP их нет, но взамен им есть ассоциативные массивы. Т. ч. не вижу здесь сишного подхода, тем более, что в C даже ООП нет.

Спустя 3 минуты, 44 секунды (13.07.2010 - 16:13) sergeiss написал(а):
Цитата (Wird_34 @ 13.07.2010 - 17:09)
что в C даже ООП нет

(с этаким хитрым прищуром "а-ля дедушка Ленин") А вот отсюда поподробнее, плз... Желательно с цитатами и ссылками. А то звучит примерно как "В СССР секса нет!" rolleyes.gif

Хотя я имел ввиду, естественно, С++ wink.gif

Спустя 4 минуты, 33 секунды (13.07.2010 - 16:17) Wird_34 написал(а):
Цитата (sergeiss @ 13.07.2010 - 13:13)
Цитата (Wird_34 @ 13.07.2010 - 17:09)
что в C даже ООП нет

А вот отсюда поподробнее, плз... Желательно с цитатами и ссылками.

Хотя я имел ввиду, естественно, С++ wink.gif

А я имел ввиду C. В плюсах тоже бы использовали структуры, но чего в PHP нет, того нет...

Спустя 2 минуты, 38 секунд (13.07.2010 - 16:20) sergeiss написал(а):
Цитата (Wird_34 @ 13.07.2010 - 17:17)
но чего в PHP нет, того нет...

А то, что я описал в этой как раз теме - это тебе не напоминает struct из Си/Си++? Да почти что 1:1!!!

Спустя 9 минут, 7 секунд (13.07.2010 - 16:29) Wird_34 написал(а):
Цитата (sergeiss @ 13.07.2010 - 13:20)
А то, что я описал в этой как раз теме - это тебе не напоминает struct из Си/Си++? Да почти что 1:1!!!

Мне структуры в PHP напоминают ассоциативные массивы, как я собственно уже заметил. У структур нет конструктора и для них, как и для массивов в данном случае нужно было бы писать отдельную функцию, ну или инициализировать следующим образом:

array[i].x = xx;
array[i].y = yy;

Единственный минус ассоциативных массивов в сравнении со структурами, это то что отдельный член структуры убрать нельзя, а у массива в PHP отдельный элемент убрать можно. Но все же возможность написания такого кода случайно, представляется мне крайне нереалистичной, хотя не спорю все возможно smile.gif

Спустя 1 час, 17 минут, 48 секунд (13.07.2010 - 17:47) LRCenter написал(а):
Спасибо за ответы, друзья. Мне подходит метод предложеный vagrand-ом.
Применил для переименования группы файлов, в первом массиве старые имена, во втором новые полное соответствие ключей. Не могут же они перепутаться, если записывались в одинаковом порядке?

Задал вопрос, а тут такие холивары начались))) Сразу видно что тут куча php-шных монстров засело))) И у каждый отстаивает методы своей школы.


_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.