[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка части массива
Helram
Привет.

//Существует массив

$array=array(
1 => 3,
2 => 3,
3 => 3,
4 => 3,
5 => 3,
6 => 3,
7 => 3,
8 => 3);

//Можно ли выбрать элементы где ключ больше 6, так есть выбрать 6 7 8.

//Массив может быть большой, и не хотелось бы foreach($array as $v => $v2){ if($v>=6){} } такую процедуру делать, можно ли обойтись без foreach?



GET
Helram

Если все ключи числовые и идут попорядку, то через array_slice, а если нет, то можно придется тестить комбинации https://secure.php.net/manual/ru/ref.array.php что-нибудь типа array_filter или array_map, думаю будет чуть быстрее чем foreach, хотя...

Как кажется на первый взгляд.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Helram, а чем тебе foreach не угодил? Любая функция работы с массивом так или иначе циклом по нему пробегает. Других "волшебных" способов нет.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Invis1ble
Цитата (GET @ 13.05.2017 - 04:04)
думаю будет чуть быстрее чем foreach, хотя

Последний раз, когда я тестил скорость, foreach был быстрее функций с колбэками. Правда не помню, на какой версии пыха проверял. Но вроде на довольно свежей.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Helram
Спасибо за ответы, буду использовать foreach
AllesKlar
Helram
Отсортируй массив по ключам, потом foreach найди ключ 6 (при неотрицательных ключах, это будет максимум 7 итераций), запомни позицию, и обрежь массив по этой позиции.

_____________
[продано копирайтерам]
sergeiss
AllesKlar, а зачем? У ТС в самом первом посте, в последней строке есть код, который на 100% рабочий и который можно/нужно использовать. Зачем усложнять, делать лишние действия, когда можно за всего одни проход сделать всё, что нужно???

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
walerus
sergeiss, ну типа что бы не гнать весь массив, а всего лишь срез до нужного ключа.
sergeiss
Цитата (walerus @ 13.05.2017 - 19:33)
ну типа что бы не гнать весь массив, а всего лишь срез до нужного ключа.

Смотри вот, что АллесКляр предложил, сколько там действий получается? :
Цитата (AllesKlar @ 13.05.2017 - 19:01)
Отсортируй массив по ключам, потом foreach найди ключ 6 (при неотрицательных ключах, это будет максимум 7 итераций), запомни позицию, и обрежь массив по этой позиции.

Сначала сортировка. Пусть это одна команда, но она внутри себя циклом пробегает по массиву. Затем проходим еще раз foreach'ем. Затем чем-то там режем, а это опять циклом проходим по массиву...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
walerus
Тест 1 Использование решения ТС
error_reporting( E_ALL );

echo "<pre>";

/*
// генерим массив тестовый
$tmp_array = array_fill_keys(range(-200,200), rand( 1000, 9999 ));

function shuffle_assoc($list) {
if (!is_array($list)) return $list;

$keys = array_keys($list);
shuffle($keys);
$random = array();
foreach ($keys as $key)
$random[$key] = $list[$key];

return $random;
}

// Перемешали массив
$tmp_array = shuffle_assoc( $tmp_array );

// сохранили
file_put_contents( 'shuffle_assoc.txt', serialize($tmp_array) );
*/

// считываем массив

$tmp_array = unserialize( file_get_contents( 'shuffle_assoc.txt' ) );

// Запускаем счетчик
$start = microtime(true);

// Запускаем foerach TC

for( $i = 0;$i <= 1000; $i++ ){
$result_array = array();
foreach( $tmp_array as $v => $v2 ){
if( $v >= 6 ){
$result_array[$v] = $v2;
}
}


echo count($result_array) . "<br>\n";
}

$time = microtime(true) - $start;
printf('Скрипт выполнялся %.16F сек.', $time);
Скрипт выполнялся 0.0886039733886719 сек. в среднем

Тест 2 задумка AllesKlar + моя доработка, убрал "срез"

// считываем массив
$tmp_array = unserialize( file_get_contents( 'shuffle_assoc.txt' ) );

// Запускаем счетчик
$start = microtime(true);

// Запускаем Тест AllesKlar, Отсортируй массив по ключам, потом foreach найди ключ 6
// (при неотрицательных ключах, это будет максимум 7 итераций), запомни позицию, и обрежь массив по этой позиции.


ksort($tmp_array);

for( $i = 0;$i <= 1000; $i++ ){

$result_array = array();
foreach( $tmp_array as $v => $v2 ){
if( $v >= 6 ){
break;
}else{
unset( $tmp_array[$v] );
}
}


echo count($tmp_array) . "<br>\n";
}

$time = microtime(true) - $start;
printf('Скрипт выполнялся %.16F сек.', $time);
Скрипт выполнялся 0.0155999660491943 сек. в среднем

зы: 2й вариант более быстрый B)
Быстрый ответ:

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