0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 58
1

Выборка минимального значения в массиве

07.03.2019, 21:57. Показов 1404. Ответов 9
Метки нет (Все метки)

Есть массив с такими данными.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    [0] => ATE от 670
    [1] => ATE от 1083
    [2] => ATE от 816
    [3] => ATE от 1301
    [4] => BOSCH от 505
    [5] => BOSCH от 871
    [6] => BOSCH от 692
    [7] => TEXTAR от 798
    [8] => TEXTAR от 513
    [9] => JURID от 538
    [10] => FERODO от 509
    [11] => FERODO от 1037
    [12] => BREMBO от 558
    [13] => BREMBO от 537
    [14] => BREMBO от 1019
Нужно оставить минимальные цены. Что бы вышло так -

PHP
1
2
3
4
5
6
    [0] => ATE от 670
    [1] => BOSCH от 505
    [2] => TEXTAR от 513
    [3] => JURID от 538
    [4] => FERODO от 509
    [5] => BREMBO от 537
Помогите, пожалуйста, с решением, в какую сторону смотреть?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2019, 21:57
Ответы с готовыми решениями:

Выборка минимального значения массива заданное число раз
имеется массив array(0 => array( 307 => array( => 300, => array( => 2...

Нахождение минимального и максимального значения двумерном массиве
Доброе время суток коллеги! Имеется такой массив : $c => id : 3165990 => price...

Выборка минимального значения из подмножеств
есть множество declare @cat table ( dated date ,id int ) insert into...

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

9
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 185
07.03.2019, 22:30 2
Зашел на форум создать свою тему, но увидел вашу и решил помочь.
Мне кажется если требуется такое решение, то изначально вы что-то делаете не так!

Но все же набросал код задачи:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$data[] = 'ATE от 670';
$data[] = 'ATE от 1083';
$data[] = 'ATE от 816';
$data[] = 'ATE от 1301';
$data[] = 'BOSCH от 505';
$data[] = 'BOSCH от 871';
$data[] = 'BOSCH от 692';
$data[] = 'TEXTAR от 798';
$data[] = 'TEXTAR от 513';
$data[] = 'JURID от 538';
$data[] = 'FERODO от 509';
$data[] = 'FERODO от 1037';
$data[] = 'BREMBO от 558';
$data[] = 'BREMBO от 537';
$data[] = 'BREMBO от 1019';
 
print_r($data);
 
$names = array_map(function ($value) {
    return preg_replace("/[^a-z]/i", '', $value);
}, $data);
 
$names = array_unique($names);
 
$groupedData = [];
foreach ($names as $name) {
    foreach ($data as $datum) {
        if (strpos($datum, $name) !== false) {
            $groupedData[$name][] = $datum;
        }
    }
}
 
print_r($groupedData);
 
$result = [];
foreach ($groupedData as $name => $datum) {
    $tmp = array_map(function ($value) {
        return preg_replace("/[^\d]/", '', $value);
    }, $datum);
    asort($tmp);
 
    $result[] = $datum[ array_keys($tmp)[0] ];
}
 
print_r($result);
Пишите в лс если есть вопросы
0
1962 / 1192 / 433
Регистрация: 13.06.2013
Сообщений: 4,009
07.03.2019, 22:36 3
Используйте explode, чтобы разделить фирму и цену.
В цикле пробегаете по каждому элементу массива, в отдельный массив добавляете фирмы(ключ) и цены(значение). Если фирма встречается повторно(т.е. уже есть такой ключ в массиве), то сравниваете цены и записываете в массив то, которое меньше.

Валентин^_^, что-то сложно у вас)
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
07.03.2019, 22:49 4
tarasalk, у меня чё-то не получилось написать по вашему принципу... Написал с использованием сортировки, х/з, тоже наверное громоздко
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$arr = [
    'ATE от 670',
    'ATE от 1083',
    'ATE от 816',
    'ATE от 1301',
    'BOSCH от 505',
    'BOSCH от 871',
    'BOSCH от 692',
    'TEXTAR от 798',
    'TEXTAR от 513',
    'JURID от 538',
    'FERODO от 509',
    'FERODO от 1037',
    'BREMBO от 558',
    'BREMBO от 537',
    'BREMBO от 1019'
];
 
$temp = [];
 
foreach ($arr as $item) {
    list($k, , $numb) = explode(' ', $item);
    $temp[$k][] = $numb;
}
 
array_walk($temp, function(&$a){ sort($a); });
$arr = [];
 
foreach ($temp as $key => $item) {
    array_key_exists($key, $arr) ?: $arr[] = $key . ' от ' . $item[0];
}
 
var_dump($arr);
Результат:
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
array (size=6)
  0 => string 'ATE от 670' (length=12)
  1 => string 'BOSCH от 505' (length=14)
  2 => string 'TEXTAR от 513' (length=15)
  3 => string 'JURID от 538' (length=14)
  4 => string 'FERODO от 509' (length=15)
  5 => string 'BREMBO от 537' (length=15)
0
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 58
07.03.2019, 22:52  [ТС] 5
Цитата Сообщение от tarasalk Посмотреть сообщение
Используйте explode, чтобы разделить фирму и цену.
В цикле пробегаете по каждому элементу массива, в отдельный массив добавляете фирмы(ключ) и цены(значение). Если фирма встречается повторно(т.е. уже есть такой ключ в массиве), то сравниваете цены и записываете в массив то, которое меньше.
Ваш вариант мне почти ясен. Моих знаний не хватает, что бы понять как написать до конца. Массив разбил, есть отдельно цены и названия. Новый массив создал, как записать ключи (названия) и значения (цены) знаю. Но как проверить был ли такой ключ добавлен ранее, не могу понять. Подскажете?
0
2 / 1 / 1
Регистрация: 26.02.2019
Сообщений: 8
08.03.2019, 08:04 6
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$one_index = array(                
 'ATE от 670','ATE от 1083','ATE от 816','ATE от 1301','BOSCH от 505','BOSCH от 871','BOSCH от 692','TEXTAR от 798','TEXTAR от 513','JURID от 538',
    ' FERODO от 509',' FERODO от 1037',' BREMBO от 558',' BREMBO от 537',' BREMBO от 1019'
);  
$q_input_word = count($one_index);
$ai = 0;
for($aj = 0;$aj < $q_input_word;$aj++)
    {
        $num[$aj] = preg_replace("/[^0-9]/", '', $one_index[$aj]);
        $words[$aj] = preg_replace('/[0-9]+/', '', $one_index[$aj]);
        
            if($aj > 0 && strcasecmp($words[$aj],$words[$aj-1]) == 0 && $aj != $q_input_word-1){
                $num_end[] = $num[$aj-1];
                            
            }elseif($aj > 0 && $aj != $q_input_word-1){
                $num_end[] = $num[$aj-1];
                $end[] = $words[$aj-1].min($num_end);
                unset($num_end);
                 
            }elseif($aj == $q_input_word-1){
                $num_end[] = $num[$aj-1];
                $num_end[] = $num[$aj];
                $end[] = $words[$aj].min($num_end);
            }
            
        
    }
    
    print_r($end);
Добавлено через 11 минут
только для отсортированного по именам массива
0
1962 / 1192 / 433
Регистрация: 13.06.2013
Сообщений: 4,009
08.03.2019, 10:15 7
Лучший ответ Сообщение было отмечено Davyduck как решение

Решение

VNIIAEN, я имел в виду такое.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
$data = [
    'ATE от 670',
    'ATE от 1083',
    'ATE от 816',
    'ATE от 1301',
    'BOSCH от 505',
    'BOSCH от 871',
    'BOSCH от 692',
    'TEXTAR от 798',
    'TEXTAR от 513',
    'JURID от 538',
    'FERODO от 509',
    'FERODO от 1037',
    'BREMBO от 558',
    'BREMBO от 537',
    'BREMBO от 1019',
];
 
$new_data = [];
foreach ($data as $item) {
    list($company,,$sum) = explode(' ', $item);
    
    if (array_key_exists($company, $new_data)) {
        if ($new_data[$company] > $sum) {
            $new_data[$company] = $sum;
        }
    }
    else {
        $new_data[$company] = $sum;
    }
}
 
array_walk($new_data, function(&$value, $key) {
    $value = $key.' от '.$value;
});
В принципе array_walk считаю тут лишним, это уже при выводе можно форматировать текст как хочется.
1
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
08.03.2019, 10:45 8
tarasalk, в общем я был близок ))
0
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 185
08.03.2019, 19:45 9
Ого! Сколько вариантов накидали.

Автор, а расскажите, для чего вообще стоит задача выбрать минимальную цену именно из ТАКОГО массива данных?
0
0 / 0 / 0
Регистрация: 30.11.2015
Сообщений: 58
08.03.2019, 20:22  [ТС] 10
Цитата Сообщение от Валентин^_^ Посмотреть сообщение
Автор, а расскажите, для чего вообще стоит задача выбрать минимальную цену именно из ТАКОГО массива данных?
Данные парсятся в таком виде, уже разбил данные на BOSCH => 505

Всем большое спасибо за помощь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2019, 20:22
Помогаю со студенческими работами здесь

Поиск минимального значения в массиве
Здравствуйте Не могу реализовать поиск минимального элемента в массиве Помогите пожалуйста с...

Нахождение минимального и максимального значения в массиве
Уважаемые программисты помогите мне пожалуйста написать программку вот: дана матрица 4 на 4...

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

Нахождение минимального и максимального значения в двумерном массиве
Пользователь вводит двумерный квадратный массив n x n. Далее необходимо найти минимальное значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru