PHP манипулирование с многомерными массивами - PullRequest
1 голос
/ 30 мая 2010

Это мой массив

Array
(
    [0] => Array
        (
            [sample_id] => 3
            [time] => 2010-05-30 21:11:47
        )

    [1] => Array
        (
            [sample_id] => 2
            [time] => 2010-05-30 21:11:47
        )

    [2] => Array
        (
            [sample_id] => 1
            [time] => 2010-05-30 21:11:47
        )
)

И я хочу получить все sample_ids в одном массиве. Может кто-нибудь, пожалуйста, помогите?

Можно ли это сделать без циклов for (поскольку массивы очень большие)

Ответы [ 4 ]

4 голосов
/ 30 мая 2010
$ids = array_map(function($el){return $el["sample_id"];}, $array);

Или в более ранних версиях:

function get_sample_id($el){return $el["sample_id"];}
$ids = array_map('get_sample_id', $array);

Однако, это, вероятно, не будет быстрее.

2 голосов
/ 30 мая 2010

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

РЕДАКТИРОВАТЬ: Я решил добавить немного метрической информации, я создал массив $data = array(array('key' => value, 'value' => other_value), ...);, где в моем массиве было 150 000 элементов. Я пробовал 3 типичных способа сплющивания

$start = microtime();
$values = array_map(function($ele){return $ele['key'];}, $data);
$end = microtime();

Производится время выполнения: Run Time: 0.304405 Выполнение 5 раз усредняет время чуть ниже 0,30

$start = microtime();
$values = array();
foreach ($data as $value) {
    $values[] = $value['key'];
}
$end = microtime();

Производится время выполнения Run Time: 0.167301 со средним значением 0,165

$start = microtime();
$values = array();
for ($i = 0; $i < count($data); $i++) {
    $values[] = $data[$i]['key'];
}
$end = microtime();

Производится время выполнения Run Time: 0.353524 со средним значением 0,355

В каждом случае использование foreach для массива данных было значительно быстрее. Вероятно, это связано с накладными расходами на выполнение функции для каждого элемента в массиве для реализации hte array_map().

Дальнейшее редактирование: я запустил это тестирование с предопределенной функцией. Ниже приведены средние числа за 10 итераций для «На лету» (определены в строке) и «Предварительно определены» (поиск строки).

Averages:
  On the fly: 0.29714539051056
  Pre Defined: 0.31916437149048
1 голос
/ 30 мая 2010

без манипулирования массивом нельзя выполнить без цикла.
если вы не видите петли, это не значит, что она отсутствует. Я могу сделать функцию

array_summ($array) {
  $ret=0;
  foreach ($array as $value) $ret += $value;
  return $ret;
}

, а затем назовите его array_summ($arr) без видимых петель. Но не обманывайтесь этим. Там есть петля. Каждая функция массива php также выполняет итерацию массива. Вы просто не видите этого.

Итак, настоящее решение, которое вам нужно искать, это не магическая функция, а сокращение этих массивов.
Откуда это пришло? Из базы данных скорее всего.
Рассмотрим создание базы данных для всех расчетов. Это сэкономит вам гораздо больше времени, чем любой PHP Bulit в функции

0 голосов
/ 30 мая 2010

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

Можете ли вы создать структуру данных sample_id одновременно с созданием массива большего размера?

Вам действительно нужен массив записей sample_id или это просто средство для достижения цели? Может быть, есть способ обернуть данные в классе, который использует кеш и курсор, чтобы избежать итерации всего, когда вам нужны только определенные куски?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...