0

I am trying to write selection algorithm in php as recursive. As seen it is correct logic but it does not work. here ar code example:

$array  = [4,5,22,0,-9];

function findmin($arr){
   
   if(sizeof($arr) > 0){
       $min_index = 0;
       for ($i = 1; $i < sizeof($arr); $i++){
           if($arr[$min_index] > $arr[$i]){
               $min_index = $i;
           }
       }
       
       unset($arr[$min_index]);
       findmin($arr);
   }   

}
findmin($array);

and output is:

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20...

p.s. line 20 is part of code: if($arr[$min_index] > $arr[$i]){

4
  • when you unset element in array, keys remain the same, reindex your array Commented Jan 21, 2019 at 10:45
  • you need to check the array after unset the value, also you need to update the $min_index because after loop it always trying the unsetting the 0th index Commented Jan 21, 2019 at 10:47
  • Shouldn't a method to find a minimum return something? Commented Jan 21, 2019 at 10:58
  • What is this supposed to do? Commented Jan 21, 2019 at 11:15

2 Answers 2

1

there is a simple way to find minimum recursivly :

function findMin($arr){
    $min = 0;
    foreach($arr as $item){
        if(is_array($item)){
            $val = findMin($item);
        }else{
            $val = $item;
        }
        $min  = $val<$min?$val:$min;
    }
    return $min;
}

also you can use min() function

Sign up to request clarification or add additional context in comments.

2 Comments

This code is for hierarchical arrays, he's just working with a flat array.
if use "for" and recursive function together you can find minimum for multidimensional arrays . for 1 dimension (flat array) you just need a "for" to find minimum or recursive function
0

When you unset element in an array, the keys remain the same. Lets have keys 0, 1, 2 - unset key 0, the array will have keys 1, 2 - so, for next loop use array_values($arr) - that will reindex you keys. Also you've missed return statement. Fixed code below

<?php

$array  = [4,5,22,0,-9];

function findmin($arr){

   if(sizeof($arr) > 1){
       $min_index = 0;
       for ($i = 1; $i < sizeof($arr); $i++){
           if($arr[$min_index] > $arr[$i]){
               $min_index = $i;
           }
       }
       unset($arr[$min_index]);
       // Here is added return and fixed indexes of array
       return findmin(array_values($arr));
   } elseif (sizeof($arr) === 1) {
       return $arr[0];
   }

}
echo findmin($array);

2 Comments

You could also use array_splice() to remove the element and reindex.
Sure, but I wanted to keep the most of original code

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.