[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Следующий ключ массива
Страницы: 1, 2
Kusss
Известен текущий ключ, нужно получить следующий.
как это можно сделать без перебора ?
$array = array(4=>'трям', 6=>'трям', 8=>'трям', 9=>'трям', 11=>'трям');
$action = 6;
foreach ($array AS $k=>$v){
if (empty($action))
return $k;
if ($k == $action)
$action = 0;
}
Valick
Kusss, http://php.net/manual/ru/ref.array.php

Хотя наверно нет без перебора не обойтись, не сразу понял задачу. Думал вам next подойдёт.
Что это за массив? Почему именно массив, а не БД. Там эта задача решается легко.


_____________
Стимулятор ~yoomoney - 41001303250491
Kusss
в БД ? так даже лучше будет. как это сделать ?

массив как раз оттуда.
Valick
Kusss, говорите сразу в следующий раз откуда массив, обычно спрашиваю, но обычно спрашиваю у новичков wink.gif
Подробнее задачу опишите.
есть $action = 6; - что это? и откуда эта цифра
ну и что надо получить на выходе?

_____________
Стимулятор ~yoomoney - 41001303250491
brevis
Цитата (Kusss @ 17.11.2015 - 14:48)
Известен текущий ключ, нужно получить следующий.
как это можно сделать без перебора ?

Да никак наверное без перебора.
Разве что использовать встроенные функции типа array_search:
function getNextKey($arr, $key) {
$keys = array_keys($arr);
$idx = array_search($key, $keys);
if ($idx === false || $idx == count($arr) - 1) return null;
return $keys[$idx+1];
}

// test
$array = array(4=>'трям', 6=>'трям', 8=>'трям', 9=>'трям', 11=>'трям');
echo getNextKey($array, 6)


http://codepad.org/1nQUwPpF

_____________
Чатик в телеге
Kusss
brevis
Спасибо за такое решение

Valick
Как бы объяснить ....

Есть входящие данные: номер раздела($razdel_select) и текущая id из выборки ($action) .
$sql = "
SELECT
name.*
FROM
`razdel2_product` AS r
LEFT JOIN
`product` AS pr ON pr.id = r.product_id
LEFT JOIN
`print_razdel` AS print_razdel ON print_razdel.print_id = pr.print_id
LEFT JOIN
`print_razdel_name` AS name ON name.id = print_razdel.print_razdel_id
WHERE
r.razdel2_id = "
.(int)$razdel_select." AND
pr.live = 0
GROUP BY
print_razdel.print_razdel_id
ORDER BY
name.id
"
;

sergeiss
Цитата (Kusss @ 17.11.2015 - 17:08)
Есть входящие данные: номер раздела($razdel_select) и текущая id из выборки ($action)

Цитата (Kusss @ 17.11.2015 - 15:48)
Известен текущий ключ, нужно получить следующий.

И что надо получить? Какой "следующий"? Из данных по указанному запросу? Если да, то что мешает это сделать в запросе?

Valick совершенно прав, что всё, что можно сделать в БД, нужно сделать в БД. И в ПХП только считать результат, а не мудрить. Отдельные сложные и вычурные случаи не берем во внимание - твой случай достаточно простой.

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

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

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

user posted image
Kusss
sergeiss
Вопрос "как это сделать ?", был тактично пропущен .

P.S. Получить следующий name.id , известно что предыдущий "тут число"
Valick
Цитата (Kusss @ 17.11.2015 - 16:54)
Вопрос "как это сделать ?", был тактично пропущен

вы не ответили на мои вопросы, я же не буду вас заставлять

_____________
Стимулятор ~yoomoney - 41001303250491
Игорь_Vasinsky
Цитата
Да никак наверное без перебора.

ещё как. тока вспотеешь.

$transport = array('foot'=>2, 'bike'=>34, 'car'=>4, 'plane'=>54);
$cur_key = 'bike';
$keys = array_keys($transport);
$fliped_array = array_flip($keys);
$indexKey = $fliped_array[$cur_key];
$slice_array = array_slice($transport, $indexKey+1,1);
$nextKeyValue = array_keys($slice_array);
$next_key =$nextKeyValue[0];

echo $next_key; //car


если в таблице нет первичного ключа - то нужен уникальный ориентир

а так

select * from table where id> (select * from table where name='car') limit 1


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
sergeiss
Цитата (Игорь_Vasinsky @ 17.11.2015 - 18:15)
select * from table where id> (select * from table where name='car') limit 1

Тока в скобках звездочу надо заменить на имя одного поля и общая схема да, такая будет (это я для ТС поясняю). Внутри скобок может быть любой запрос, в т.ч. твой с джойнами.

PS. Что касается начального вопроса, насчет поиска в массиве, то любое решение, отличающееся от простого перебора, должно быть более долгим по времени smile.gif Потому что все встроенные функции все равно будут по массиву бегать и что-то делать. В том решении, что Игорь написал (на ПХП) этих циклов внутри функций будет много.

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

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

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

user posted image
Игорь_Vasinsky
Цитата
В том решении, что Игорь написал (на ПХП) этих циклов внутри функций будет много.

не не. это я показал что без циклов php это возможно

а так - ну всем же ясно - если можно сделать с данным сразу в бд то что нужно сделать - то надо и делать на уровне БД

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dezigo
используй next()
http://php.net/manual/en/function.next.php

но, это сдвинет указатель

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';
?>
Valick
Dezigo, не прокатит, известен только ключ, указатель на начале массива.


_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 17.11.2015 - 21:20)
не прокатит

Ну почему же? Прокатит smile.gif Но это будет идентично использованию foreach

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

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

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

user posted image
Быстрый ответ:

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