How to deal with an array of equal values and max function? - php

In PHP, max() returns the highest value in an array or the greatest value among inputs. If we have two or more equally greatest values, how to deal with that situation?
eg
$arr = array("a"=>1,"b"=>10, "c"=>10);
now, what should max($arr), return. Ideally it returns the first encountered highest value, b. What if I want both b and c as result?

If you have the highest value in that array (that is, what max() returns), you can just search for all occurrences of that value in the array:
$arrOfKeys = array_keys($arr, max($arr));

max() returns the maximum value, not the array key it is associated with. It will simply return (int) 10 in the example you give.
If you want a list of the keys that have the maximum value you could do something like this:
$max = max($array);
$maxKeys = array();
foreach ($array as $key => $val) {
if ($val == $max) {
$maxKeys[] = $key;
}
}
print_r($maxKeys);
/*
Array
(
[0] => b
[1] => c
)
*/

Related

PHP counter excluding zeros

In PHP I have an array that returns a set of values. I want to count the number of instances in the array excluding the zeros. Basically I'm creating an average total column in a table and if a person did not contribute then I don't want to count them. I have the total amount, just not the total count that contributes. Any help please?
You can do it with count and array_filter method.
count gives you the total number of elements in an array.
array_filter removes all elements whose value represents false(such as 0 empty string etc.) from an array;
Eg:
echo count(array_filter($your_array));
Use foreach to iterate the array and count the items that are not "zero".
$counter = 0;
foreach ($array as $item) {
if ( /* determine if $item is "not zero" */ ) {
++$counter;
}
}
echo $counter;
That's all I can tell you based on the information you provided.
You can give a callback function to array_filter as the second parameter. (http://php.net/manual/en/function.array-filter.php)
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
So you can do something like this:
function isNonZero(int $num){
return $num !== 0;
}
count(array_filter([0,1,2,3,4], "isNonZero")); // => 4

Find values in PHP Array and calculate

I am trying to make a function where I get data from specific positions in an array, and then add(plus) the results together. Something like this:
$specificPositionsInArray = "1,4,12,27,40,42,48,49,52,53,56,58";
$dataArray = "1,2,3,4,5,6,7,8"; // More than hundred values.
myfunction($specificPositionsInArray) {
// Find position in array, based on $specificPositionsInArray and then
// plus the value with the previous value
// that is found in the $specificPositionsInArray.
// Something like:
$value = $value + $newValue;
return $value;
}
So if $specificPositionsInArray was 1,3,5
The $value that should be returned would be: 9 (1+3+5) (based on the $dataArray).
Maybe there is another way to do it, like without the function.
Here's a functional approach:
$specificPositionsInArray = array(1,3,7,6);
$dataArray = array(1,2,3,4,5,6,7,8);
function totalFromArrays($specificPositionsInArray, $dataArray) {
foreach ($specificPositionsInArray as $s){
$total += $dataArray[$s];
}
return $total;
}
$total = totalFromArrays($specificPositionsInArray, $dataArray);
echo $total;
You should look into arrays and how to handle them, you could have found the solution pretty easily. http://www.php.net/manual/en/book.array.php
//$specificPositionsInArray = array(1,4,12,27,40,42,48,49,52,53,56,58);
$specificPositionsInArray = array(1,3,5);
$dataArray = array(1,2,3,4,5,6,7,8);
$total=0;
foreach($specificPositionsInArray as $k => $v){
$total += $dataArray[$v-1];
}
echo $total;
The weird part about this is the $v-1 but because of how you want to handle the addition of the items, and an array starts with element 0, you have to subtract 1 to get to the right value.
So you want to do something like this:
$dataArray = array(1,2,3,4,5...); // 100+ values, not necessarily all integers or in ascending order
$specificPositions = array(1, 3, 5);
function addSpecificPositions($data, $positions) {
$sum = 0;
foreach($positions as $p)
$sum += $data[$p];
return $sum;
}
If you really want to keep your list of values in a string (like you have it in your example), you'll have to do an explode first to get them in array form.
Since it looks like your array is using numeric values for the keys this should be fairly easy to calculate. I refactored your code a little to make it easier to read:
$specificPositionsInArray = array(1,4,6,7);
By default PHP will assign numeric keys to each value in your array, so it will look like this to the interpreter.
array(
[0] => 1,
[1] => 4,
[2] => 6,
[3] => 7
)
This is the same for all arrays unless you specify a numeric or mixed key. Since the data array seems to just be values, too, and no keys are specified, you can simply target them with the key that they will be associated with. Say I use your array example:
$dataArray = array(1,2,3,4,5,6,7,8);
This will look like this to the parser:
array(
[0] => 1,
[1] => 2,
[2] => 3,
[3] => 4,
[4] => 5,
[5] => 6,
[6] => 7,
[7] => 8
)
If you wanted to select the number 6 from this array, you actually need to use $dataArray[5] since array keys start at zero. So for your function you would do this:
$specificPositionsInArray = array(1,4,6,7);
$dataArray = array(1,2,3,4,5,6,7,8);
calculate_array($specificPositionsInArray, $dataArray); // Returns 18
function calculate_array($keys, $data){
$final_value = 0; // Set final value to 0 to start
// Loop through values
foreach($keys as $key){
// Add the keys to our starting value
$final_value += $data[$key-1]; // minus 1 from key so that key position is human readable
}
// return the sum of the values
return $final_value;
}

Find shortest array count in multidimensional array

I have a multidimensional array:
$arr = array(
array('lions', 'tigers', 'bears'), // count = 3
array('dogs', 'cats'), // count = 2
array('horses', 'pigs', 'cattle', 'sheep', 'chickens') // count = 5
);
I want to return the array with the lowest count (I don't need to know the count, just need the array that HAS the lowest count). In this case, array('dogs', 'cats')
Right now I have:
$lowest = null;
foreach($nodePath as $arr)
{
$lowest = count($arr) < count($lowest) || $lowest == null ? $arr : $lowest;
}
This works but I'm wondering if I missed a more contained solution, perhaps using array_map, array_walk or a similar function.
Use array_map() with count as a callback to get the number of elements in each array, min() to get the smallest value. Then, to get the key of the smallest array - use array_flip() to flip the arrays keys and values, and access the $minth index. Now you can use the key to get the array you need:
$counts = array_map('count', $arr);
$min = min($counts);
$key = array_flip($counts)[$min];
$smallest_arr = $arr[$key];
Demo
Map your array to another array with counts of each child array. Get the key of the minimum value in this new array. Smallest array has the key of the minimum value:
$count = array_map('count', $arr);
$min = array_keys($count , min($count))[0];
var_dump($arr[$min]); // Array ( [0] => dogs [1] => cats )
Eval.in

how to get the numeric position of the array using php

i want to get the exact numeric position of the value in the array
array value:
$val = array('banana' , 'second' , 'apple');
when user search for the value apple
it will display
3
because it's the 3rd element
and when the user search for banana
it will display
1
Using array_search() like so:
$num = array_search('banana', $array) + 1;
$keys= array_keys($val, "apple")
Will return an array with the value 2 (all the indexes of the array that have the value "apple").
then you just have to get the first element of that array and add 1
$numericPosition = current($keys)
If $keys is empty, that is, "apple" doesnt exist in array, then $numericPosition === false, otherwise add 1. This ensures you can actually detect when a value doesnt exist, if you just add 1 to current($keys) any value not in the array will be at position 1.
Edit: array_search of the other answer will return only the 1st key of a given value, so it may match your needs better, just make sure you check for false before you add 1.
There is no other way (contrary to what other answers will suggest) than going through the array and checking. Any other solution will be a hack depending on the specific shape of your array (values or keys).
$search = "banana";
$index = 1;
foreach ($val as $v) {
if ($v === $search) break;
$index++;
}
echo "$search is number: $index ";
$word = 'banana';
$position = array_search($word, $val) + 1;

PHP: How do I check the contents of an array for my string?

I a string that is coming from my database table say $needle.
If te needle is not in my array, then I want to add it to my array.
If it IS in my array then so long as it is in only twice, then I still
want to add it to my array (so three times will be the maximum)
In order to check to see is if $needle is in my $haystack array, do I
need to loop through the array with strpos() or is there a quicker method ?
There are many needles in the table so I start by looping through
the select result.
This is the schematic of what I am trying to do...
$haystack = array();
while( $row = mysql_fetch_assoc($result)) {
$needle = $row['data'];
$num = no. of times $needle is in $haystack // $haystack is an array
if ($num < 3 ) {
$$haystack[] = $needle; // hopfully this adds the needle
}
} // end while. Get next needle.
Does anyone know how do I do this bit:
$num = no. of times $needle is in $haystack
thanks
You can use array_count_values() to first generate a map containing the frequency for each value, and then only increment the value if the value count in the map was < 3, for instance:
$original_values_count = array_count_values($values);
foreach ($values as $value)
if ($original_values_count[$value] < 3)
$values[] = $value;
As looping cannot be completely avoided, I'd say it's a good idea to opt for using a native PHP function in terms of speed, compared to looping all values manually.
Did you mean array_count_values() to return the occurrences of all the unique values?
<?php
$a=array("Cat","Dog","Horse","Dog");
print_r(array_count_values($a));
?>
The output of the code above will be:
Array (
[Cat] => 1,
[Dog] => 2,
[Horse] => 1
)
There is also array_map() function, which applies given function to every element of array.
Maybe something like the following? Just changing Miek's code a little.
$haystack_count = array_count_values($haystack);
if ($haystack_count[$needle] < 3)
$haystack[] = $needle;

Categories