имеется массив Код (PHP): $array = array(0 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'free' => 1 ), ), ), 1 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'free' => 1 ), ), ), 2 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'free' => 1 ), ), ), ); Нужно выбрать минимальное значение из каждого элемента массива, но только так чтобы количество раз выборки одного элемента не превышало значения ['free'] этого элемента есть функция Код (PHP): function arrayMin($array) { $output_two = array(); foreach ($array as $key => $value) { $min = min($value); $output_two[$key] = $min; } return $output_two; } в которую я загоняю этот массив и на выходе получаю Код (PHP): array(0 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), ), 1 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), ), 2 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), ), ); Во всех трех элементах остается элемент с ключем 307 т.к. значение price у него минимальное. Но у элементс ключем 307 значение free = 2, т.е. этот элемент не может быть выбран больше 2х раз. Т.е. должен получиться массив такого вида Код (PHP): array(0 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), ), 1 => array( 307 => array( 'price' => 300, 'info' => array( 'free' => 2 ), ), ), 2 => array( 896 => array( 'price' => 9800 'info' => array( 'free' => 1 ), ), ), ); в 3й элемент основного массива у нас должен записаться элемент с ключом 896, т.к. элемент с ключом 307 уже был выбран 2 раза, а это число равно значению free этого элемента (['free'] => 2) , следовательно мы должны взять элемент с ключом 417, но значение free у этого элемента 0, следовательно с этим ключом мы вообще не можем брать значения и нам нужно взять элемент с ключом 896. Но если бы и этот элемент был выбран больше,чем его значение free, а именно 1 раз и дальше нам не нечего выбирать то мы пишем в array[2] значение 0 . PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Нужно выбрать минимальное значение из каждого элемента массива, но только так чтобы количество раз выборки одного элемента не превышало значения ['free'] этого элемента. Как это сделать? Я описал что должно должно получиться
На бумажке пробовал расписать как ты это делаешь как человек? А перевести это дело в if, else, foreach уже дело техники.
Ну ты же нам сюда написал, значит как человек из цикла вышел, вот по тем же параметрам можно выйти из программы. Если хочешь готовый код, можешь писать в раздел "сделайте за меня" и ждать у моря погоды, а в этом разделе учат. Если ты сам не знаешь как составить алгоритм(не код), то остаётся только ждать кто за тебя это сделает.
я пробовал делать так Код (PHP): $array = array(0 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), 1 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), 2 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), ); class Test{ function __construct(){ } function arrayMinNew($array) { $output_two = array(); $minKey = array(); foreach ($array as $key => $value) { $min = min($value); if(array_key_exists($min['info']['id'], $minKey)){ $minKey[$min['info']['id']] = $minKey[$min['info']['id']]+1; } else { $minKey[$min['info']['id']] = 1; } if($minKey[$min['info']['id']] > $min['info']['free'] && $min['info']['free'] > 0){ unset($value[$min['info']['id']]); $output_two[$key] = min($value); } else { $output_two[$key] = $min; } } echo '<pre>'; print_r($output_two); echo '<pre>'; return $output_two; } } $test = new Test(); $test->arrayMinNew($array) но так не то, я так выбираю второй элемент,хотя по условию я должен его пропустить,т.к. free там ноль, хз что делать...
Ты пишешь код без алгоритма, выходит так: хочу сделать то, не знаю что. Идеальный расклад из головы не сходиться с законами реальности, нет необходимой детализации того что хочешь сделать.
рекурсия сделала свое дело, всем спасибо Код (Text): $array = array(0 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), 1 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), 2 => array( 307 => array( 'price' => 300, 'info' => array( 'id' => 307, 'free' => 2 ), ), 417 => array( 'price' => 2400, 'info' => array( 'id' => 417, 'free' => 0 ), ), 896 => array( 'price' => 9800, 'info' => array( 'id' => 896, 'free' => 1 ), ), ), ); class Test{ private $output_two = array(); function __construct(){ } function arrayMinNew($array) { $minKey = array(); foreach ($array as $key => $value) { $min = min($value); if(array_key_exists($min['info']['id'], $minKey)){ $minKey[$min['info']['id']] = $minKey[$min['info']['id']]+1; } else { $minKey[$min['info']['id']] = 1; } if($minKey[$min['info']['id']] > $min['info']['free'] || $min['info']['free'] == 0){ unset($array[$key][$min['info']['id']]); $this->arrayMinNew($array); } else { $this->output_two[$key] = $min; } } return $this->output_two; } } $test = new Test(); echo '<pre>'; print_r($test->arrayMinNew($array)); echo '<pre>'; особенная благодарность denis01 , он очень внимательно изучил проблему и активно помогал в ее решении. Очень ему благодарен. куда же детальнее, в первом посте описал суть проблемы,какой массив есть и какой из него хочу получить и по какому условию