Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Максимального значение ассоциативного массива
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Всем привет. Есть массив такого плана
$arr[0]['price'];
$arr[1]['price'];
echo $arr[0]['price'];//50
echo $arr[1]['price'];//100
и т.д.
Соответственно, подскажите, как вычислить максимальное значение поля price у всех элементов в массиве, а также, получение индекса максимального значения в этом массиве, для того, чтобы вынести объект в отдельный массив, а из исходного удалить для дальнейшей получения максимальных значений до определенной поры.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




    $arr[0]['price'] = 100;
$arr[1]['price'] = 70;
$arr[2]['price'] = 150;
$arr[3]['price'] = 80;
$arr[4]['price'] = 310;

$sort = sort_to_array($arr, 'price');

krsort($sort);
print_r($sort);

function sort_to_array($array, $by) {
$result = array();
foreach ($array as $val) {
if (!is_array($val) || !key_exists($by, $val)) {
continue;
}
end($result);
$current = current($result);
while ($current[$by] > $val[$by]) {
$result[key($result)+1] = $current;
prev($result);
$current = current($result);
}
$result[key($result)+1] = $val;
}
return $result;
}

PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Спасибо большое) Я уже тут велосипед изобретать начал) Хотел вынести все значения в отдельный массив, потом через max выносить значения по убыванию и присваивать эти значения юзерам, у которых сходятся эти значения. А тут оказывается можно несколько проще реализовать)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




Godwarlock
ну как-бы это не совсем проще. Не подумавши функцию прикрутил
Проще это вот так.
$sort = [];
foreach ($arr AS $key=>$value){
$sort[$key] = $value['price'];
}

arsort($sort);
print_r($sort);


то функция сортировки многомерного массива.
$array = [
[

'price' => 50,
'number' => 3,
'sale' => 1,
],
[

'price' => 150,
'number' => 4,
'sale' => 12,
],
[

'price' => 70,
'number' => 13,
'sale' => 6,
],
[

'price' => 80,
'number' => 7,
'sale' => 2,
],
];


print_r( sort_to_array($array, 'price') );
print_r( sort_to_array($array, 'number') );
print_r( sort_to_array($array, 'sale') );


function sort_to_array($array, $by) {
$result = array();
foreach ($array as $val) {
if (!is_array($val) || !key_exists($by, $val)) {
continue;
}
end($result);
$current = current($result);
while ($current[$by] > $val[$by]) {
$result[key($result)+1] = $current;
prev($result);
$current = current($result);
}
$result[key($result)+1] = $val;
}
return $result;
}


Это сообщение отредактировал Kusss - 9.10.2016 - 20:10
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Ммм. Хорошо. А как ограничить количество элементов, до 30? То есть когда отсортировалось 30 элементов, после них остальные уже не идут в массив. И еще такая тема. Индексация выходного массива, сортируется странным образом, то есть начало элемента начинается не с 0, как это должно быть, а может начаться с 12 или 20 и т.п в обратную сторону я так понял, а надо чтобы индексация все же начиналась с 0 - максимальное значение, иначе при обработке через for, первые элементы вызывают ошибку, по скольку их не существует, от того не получается вынести только первые 30 элементов.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Всё. Вопрос исчерпан. Решил в общем по циклу с конца пройтись, решил проблему и с количество элементов и с их индексацией. Правда не знаю как это будет быстро работать, если выходных с сортировки элементов будет больше 100000)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




зачем перебирать массив через for, до достижения 30 ?
$i = 0;
foreach ($sort AS $key=>$value){
if ($i == 30)
break;
$i++;
}

Цитата
break прерывает выполнение текущей структуры for, foreach, while, do-while или switch.
http://php.net/manual/ru/control-structures.break.php
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Я решил проблему таким способом
 
krsort($sort);
$j = 0;
for ($i = $count_arr; $i > 0;$i-- )
{
if($j <= 30)
{
$new_array[] = $sort[$i];
$j++;
}else
{
break;
}
}

return $new_array;

Таким образом, мы просто поменяли местами индексы, но сортировка осталась та же. Только теперь массив начинается с 0, как и должно быть, а не с максимального количества элементов.
Другими словами было так
{"12":{"id":"12","price":1525}},"11"{}...

А стало так
{"0":{"id":"12","price":1525}},"1"{}...

Ну а зачем мне 30 записей выводить, а не к примеру - все, это соответственно уже нюанс программы, которая должна принимать на себя не более 30 записей.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




как-то у тебя все странно. Я бы сделал так
$arr = [
[

'id' => 1,
'price' => 50,
],
[

'id' => 2,
'price' => 150,
],
[

'id' => 3,
'price' => 70,
],
[

'id' => 4,
'price' => 80,
],
];

$sort = [];
foreach ($arr AS $key=>$value){
$sort[ $value['id'] ] = $value['price'];
}

rsort($sort);
$out_number = array_slice($sort, 0, 3); // извлекаем первые 3 элемента

$new = [];
foreach ($out_number AS $id=>$price){
$new[] = [
'id' => $id,
'price' => $price,
];

}

print_r($new);


Это сообщение отредактировал Kusss - 9.10.2016 - 22:53
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




напиши часть входного массива, из которого ты получаешь $arr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




array(12) {
[0]=>
array(2) {
["id"]=>
string(2) "10"
["price"]=>
int(0)
}
[1]=>
array(2) {
["id"]=>
string(2) "11"
["price"]=>
int(338)
}
[2]=>
array(2) {
["id"]=>
string(2) "12"
["price"]=>
int(1525)
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




Это не то. Я просил не сам массив, а ИЗ чего ты его получаешь .
То есть, можно ли пересобрать твой массив $arr ?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




 $query - это все записи из бд.

while($row = (mysqli_fetch_assoc($query)))
{

$status['users'][] = $row;
}


for($i = 0; $i<$users_count;$i++)
{
$id = $status['users'][$i]['id'];
$price = $status['users'][$i]['price'];
$users_arr[$i]['id'] = $id;
$users_arr[$i]['price'] = $price;
}

А зачем его пересобирать?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1451
Пользователь №: 28976
На форуме: 5 лет, 8 месяцев
Карма: 83




Затем, что ходить на соседний двор - лучше через калитку, а не через луну.
ЧТО мешает решить твою задачу в mysql запросом ?
$sql = "
....
ORDER BY
price DESC
LIMIT
0, 30
"
;


Это сообщение отредактировал Kusss - 9.10.2016 - 23:36
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Godwarlock  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 376
Пользователь №: 26806
На форуме: 6 лет, 16 дней
Карма:




Потому что присутствует параметр(поле в таблице), в который записан json, в этом джейсоне другие значения, которые также надо сортировать по величинам. Об этом методе я знаю, но он не применим в моем случае)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса