За последние 24 часа нас посетили 49122 программиста и 1758 роботов. Сейчас ищут 687 программистов ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем olejan1991, 1 июл 2015.

  1. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    имеется массив
    Код (PHP):
    1. $array = array(0 => array(
    2.         307 => array(
    3.             'price' => 300,
    4.             'info' => array(
    5.                 'free' => 2
    6.             ),
    7.         ),
    8.         417 => array(
    9.             'price' => 2400,
    10.             'info' => array(
    11.                 'free' => 0
    12.             ),
    13.         ),
    14.         896 => array(
    15.             'price' => 9800,
    16.             'info' => array(
    17.                 'free' => 1
    18.             ),
    19.         ),
    20.     ),
    21.     1 => array(
    22.         307 => array(
    23.             'price' => 300,
    24.             'info' => array(
    25.                 'free' => 2
    26.             ),
    27.         ),
    28.         417 => array(
    29.             'price' => 2400,
    30.             'info' => array(
    31.                 'free' => 0
    32.             ),
    33.         ),
    34.         896 => array(
    35.             'price' => 9800,
    36.             'info' => array(
    37.                 'free' => 1
    38.             ),
    39.         ),
    40.     ),
    41.     2 => array(
    42.         307 => array(
    43.             'price' => 300,
    44.             'info' => array(
    45.                 'free' => 2
    46.             ),
    47.         ),
    48.         417 => array(
    49.             'price' => 2400,
    50.             'info' => array(
    51.                 'free' => 0
    52.             ),
    53.         ),
    54.         896 => array(
    55.             'price' => 9800,
    56.             'info' => array(
    57.                 'free' => 1
    58.             ),
    59.         ),
    60.     ),
    61. );
    62.  
    Нужно выбрать минимальное значение из каждого элемента массива, но только так чтобы количество раз выборки одного элемента не превышало значения ['free'] этого элемента

    есть функция

    Код (PHP):
    1. function arrayMin($array) {
    2.  
    3.         $output_two = array();
    4.  
    5.         foreach ($array as $key => $value) {
    6.             $min = min($value);
    7.  
    8.             $output_two[$key] = $min;
    9.         }
    10.  
    11.         return $output_two;
    12.     }
    13.  
    в которую я загоняю этот массив и на выходе получаю

    Код (PHP):
    1. array(0 => array(
    2.         307 => array(
    3.             'price' => 300,
    4.             'info' => array(
    5.                 'free' => 2
    6.             ),
    7.         ),
    8.     ),
    9.     1 => array(
    10.         307 => array(
    11.             'price' => 300,
    12.             'info' => array(
    13.                 'free' => 2
    14.             ),
    15.         ),
    16.     ),
    17.     2 => array(
    18.         307 => array(
    19.             'price' => 300,
    20.             'info' => array(
    21.                 'free' => 2
    22.             ),
    23.         ),
    24.     ),
    25. );
    26.  
    Во всех трех элементах остается элемент с ключем 307 т.к. значение price у него минимальное. Но у элементс ключем 307 значение free = 2, т.е. этот элемент не может быть выбран больше 2х раз. Т.е. должен получиться массив такого вида

    Код (PHP):
    1. array(0 => array(
    2.         307 => array(
    3.             'price' => 300,
    4.             'info' => array(
    5.                 'free' => 2
    6.             ),
    7.         ),
    8.     ),
    9.     1 => array(
    10.         307 => array(
    11.             'price' => 300,
    12.             'info' => array(
    13.                 'free' => 2
    14.             ),
    15.         ),
    16.     ),
    17.     2 => array(
    18.         896 => array(
    19.             'price' => 9800
    20.             'info' => array(
    21.                 'free' => 1
    22.             ),
    23.         ),
    24.     ),
    25. );
    26.  
    в 3й элемент основного массива у нас должен записаться элемент с ключом 896, т.к. элемент с ключом 307 уже был выбран 2 раза, а это число равно значению free этого элемента (['free'] => 2) , следовательно мы должны взять элемент с ключом 417, но значение free у этого элемента 0, следовательно с этим ключом мы вообще не можем брать значения и нам нужно взять элемент с ключом 896. Но если бы и этот элемент был выбран больше,чем его значение free, а именно 1 раз и дальше нам не нечего выбирать то мы пишем в array[2] значение 0 .

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так в чём вопрос к нам?
     
  3. zahermaher

    zahermaher Новичок

    С нами с:
    27 сен 2014
    Сообщения:
    169
    Симпатии:
    14
    наверно делится опытом или хвалится ))
     
  4. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    Нужно выбрать минимальное значение из каждого элемента массива, но только так чтобы количество раз выборки одного элемента не превышало значения ['free'] этого элемента. Как это сделать? Я описал что должно должно получиться
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    На бумажке пробовал расписать как ты это делаешь как человек? А перевести это дело в if, else, foreach уже дело техники.
     
  6. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    да не выходит, какой-то бесконечный цикл получается
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну ты же нам сюда написал, значит как человек из цикла вышел, вот по тем же параметрам можно выйти из программы.
    Если хочешь готовый код, можешь писать в раздел "сделайте за меня" и ждать у моря погоды, а в этом разделе учат.
    Если ты сам не знаешь как составить алгоритм(не код), то остаётся только ждать кто за тебя это сделает.
     
  8. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    я пробовал делать так
    Код (PHP):
    1. $array = array(0 => array(
    2.         307 => array(
    3.             'price' => 300,
    4.             'info' => array(
    5.                 'id' => 307,
    6.                 'free' => 2
    7.             ),
    8.         ),
    9.         417 => array(
    10.             'price' => 2400,
    11.             'info' => array(
    12.                 'id' => 417,
    13.                 'free' => 0
    14.             ),
    15.         ),
    16.         896 => array(
    17.             'price' => 9800,
    18.             'info' => array(
    19.                 'id' => 896,
    20.                 'free' => 1
    21.             ),
    22.         ),
    23.     ),
    24.     1 => array(
    25.         307 => array(
    26.             'price' => 300,
    27.             'info' => array(
    28.                 'id' => 307,
    29.                 'free' => 2
    30.             ),
    31.         ),
    32.         417 => array(
    33.             'price' => 2400,
    34.             'info' => array(
    35.                 'id' => 417,
    36.                 'free' => 0
    37.             ),
    38.         ),
    39.         896 => array(
    40.             'price' => 9800,
    41.             'info' => array(
    42.                 'id' => 896,
    43.                 'free' => 1
    44.             ),
    45.         ),
    46.     ),
    47.     2 => array(
    48.         307 => array(
    49.             'price' => 300,
    50.             'info' => array(
    51.                 'id' => 307,
    52.                 'free' => 2
    53.             ),
    54.         ),
    55.         417 => array(
    56.             'price' => 2400,
    57.             'info' => array(
    58.                 'id' => 417,
    59.                 'free' => 0
    60.             ),
    61.         ),
    62.         896 => array(
    63.             'price' => 9800,
    64.             'info' => array(
    65.                 'id' => 896,
    66.                 'free' => 1
    67.             ),
    68.         ),
    69.     ),
    70. );
    71.  
    72. class Test{
    73.  
    74. function __construct(){
    75.    
    76. }
    77. function arrayMinNew($array) {
    78.  
    79.         $output_two = array();
    80.         $minKey = array();
    81.  
    82.         foreach ($array as $key => $value) {
    83.             $min = min($value);
    84.             
    85.             
    86.             if(array_key_exists($min['info']['id'], $minKey)){
    87.                 $minKey[$min['info']['id']] = $minKey[$min['info']['id']]+1;
    88.             } else {
    89.                 $minKey[$min['info']['id']] = 1;
    90.             }
    91.  
    92.             if($minKey[$min['info']['id']] > $min['info']['free'] && $min['info']['free'] > 0){
    93.                                
    94.                 unset($value[$min['info']['id']]);
    95.  
    96.                 $output_two[$key] = min($value);
    97.                 
    98.             } else {
    99.                 $output_two[$key] = $min;
    100.             }
    101.             
    102.         }
    103.  
    104.         echo '<pre>';
    105.         print_r($output_two);
    106.         echo '<pre>';
    107.  
    108.  
    109. return $output_two;
    110.  
    111. }
    112. }
    113.  
    114. $test = new Test();
    115.  
    116. $test->arrayMinNew($array)
    но так не то, я так выбираю второй элемент,хотя по условию я должен его пропустить,т.к. free там ноль, хз что делать...
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ты пишешь код без алгоритма, выходит так: хочу сделать то, не знаю что.
    Идеальный расклад из головы не сходиться с законами реальности, нет необходимой детализации того что хочешь сделать.
     
  10. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    рекурсия сделала свое дело, всем спасибо

    Код (Text):
    1.  
    2. $array = array(0 => array(
    3.         307 => array(
    4.             'price' => 300,
    5.             'info' => array(
    6.                 'id' => 307,
    7.                 'free' => 2
    8.             ),
    9.         ),
    10.         417 => array(
    11.             'price' => 2400,
    12.             'info' => array(
    13.                 'id' => 417,
    14.                 'free' => 0
    15.             ),
    16.         ),
    17.         896 => array(
    18.             'price' => 9800,
    19.             'info' => array(
    20.                 'id' => 896,
    21.                 'free' => 1
    22.             ),
    23.         ),
    24.     ),
    25.     1 => array(
    26.         307 => array(
    27.             'price' => 300,
    28.             'info' => array(
    29.                 'id' => 307,
    30.                 'free' => 2
    31.             ),
    32.         ),
    33.         417 => array(
    34.             'price' => 2400,
    35.             'info' => array(
    36.                 'id' => 417,
    37.                 'free' => 0
    38.             ),
    39.         ),
    40.         896 => array(
    41.             'price' => 9800,
    42.             'info' => array(
    43.                 'id' => 896,
    44.                 'free' => 1
    45.             ),
    46.         ),
    47.     ),
    48.     2 => array(
    49.         307 => array(
    50.             'price' => 300,
    51.             'info' => array(
    52.                 'id' => 307,
    53.                 'free' => 2
    54.             ),
    55.         ),
    56.         417 => array(
    57.             'price' => 2400,
    58.             'info' => array(
    59.                 'id' => 417,
    60.                 'free' => 0
    61.             ),
    62.         ),
    63.         896 => array(
    64.             'price' => 9800,
    65.             'info' => array(
    66.                 'id' => 896,
    67.                 'free' => 1
    68.             ),
    69.         ),
    70.     ),
    71. );
    72.  
    73. class Test{
    74.  
    75. private $output_two = array();
    76.  
    77. function __construct(){
    78.    
    79. }
    80. function arrayMinNew($array) {
    81.  
    82.        
    83.         $minKey = array();
    84.  
    85.         foreach ($array as $key => $value) {
    86.             $min = min($value);
    87.            
    88.            
    89.             if(array_key_exists($min['info']['id'], $minKey)){
    90.                 $minKey[$min['info']['id']] = $minKey[$min['info']['id']]+1;
    91.             } else {
    92.                 $minKey[$min['info']['id']] = 1;
    93.             }
    94.  
    95.             if($minKey[$min['info']['id']] > $min['info']['free'] || $min['info']['free'] == 0){
    96.                        
    97.      
    98.                 unset($array[$key][$min['info']['id']]);
    99.                  
    100.                 $this->arrayMinNew($array);
    101.                      
    102.                
    103.             } else {
    104.  
    105.                 $this->output_two[$key] = $min;
    106.             }
    107.            
    108.         }      
    109.  
    110.        
    111.  
    112.  
    113. return $this->output_two;
    114.  
    115. }
    116. }
    117.  
    118. $test = new Test();
    119.  
    120.  
    121.         echo '<pre>';
    122.         print_r($test->arrayMinNew($array));
    123.         echo '<pre>';
    особенная благодарность denis01 , он очень внимательно изучил проблему и активно помогал в ее решении. Очень ему благодарен.


    куда же детальнее, в первом посте описал суть проблемы,какой массив есть и какой из него хочу получить и по какому условию
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну я до сих пор не понял, что тебе нужно было сделать.