min and max in multidimensional-array [duplicate]
hi i am trying to find min and max values of x and y how can i find this min and max functions is not working correctly
$dataPoints = array(
array('x' => 2343, 'y' => 4322),
array('x' => 103, 'y' => 303 ),
array('x' => 2345,'y' => 2321 ),
array('x' => 310, 'y' => 2044 ),
array('x' => 173, 'y' => 793 ),
array('x' => 456, 'y' => 2675),
array('x' => 24, 'y' => 819 ));
I thinik you will have to write your own function:
<?php
function max_with_key($array, $key) {
if (!is_array($array) || count($array) == 0) return false;
$max = $array[0][$key];
foreach($array as $a) {
if($a[$key] > $max) {
$max = $a[$key];
}
}
return $max;
}
$dataPoints = array(
array('x' => 2343, 'y' => 4322),
array('x' => 103, 'y' => 303 ),
array('x' => 2345,'y' => 2321 ),
array('x' => 310, 'y' => 2044 ),
array('x' => 173, 'y' => 793 ),
array('x' => 456, 'y' => 2675),
array('x' => 24, 'y' => 819 ));
$max_x = max_with_key($dataPoints, 'x'); //2343
$max_y = max_with_key($dataPoints, 'y'); //4322
?>
You can use PHP's array_column() (PHP 5 >= 5.5.0) for this:
$min_x = min( array_column( $dataPoints, 'x' ) );
$min_y = min( array_column( $dataPoints, 'y' ) );
$max_x = max( array_column( $dataPoints, 'x' ) );
$max_x = max( array_column( $dataPoints, 'y' ) );
Try something like this:
foreach($dataPoints as $point) {
if (!isset($x) || $point['x'] > $x) {
$x = $point['x'];
}
if (!isset($y) || $point['y'] > $y) {
$y = $point['y'];
}
}
I'm a Fan of the Underscore Library
http://brianhaveri.github.com/Underscore.php/#max
Not native but will save you from having write the function your self, plus many other functions :)
oh and it becomes a one-liner!
Example:
include_once 'underscore.php';
$dataPoints = array(
array('x' => 2343, 'y' => 4322),
array('x' => 103, 'y' => 303 ),
array('x' => 2345,'y' => 2321 ),
array('x' => 310, 'y' => 2044 ),
array('x' => 173, 'y' => 793 ),
array('x' => 456, 'y' => 2675),
array('x' => 24, 'y' => 819 )
);
__::max($dataPoints, function($item) { return $item['x']; }); // array('x' => 2345,'y' => 2321 )
__::min($dataPoints, function($item) { return $item['y']; }); // array('x' => 103, 'y' => 303 )
You can find individually the minimum and maximum values of each column by combining array_column, min and max functions:
$min_x = min(array_column($dataPoints, 'x'));
$max_x = max(array_column($dataPoints, 'x'));
$min_y = min(array_column($dataPoints, 'y'));
$max_y = max(array_column($dataPoints, 'y'));
//to find max use rsort() & for min :sort()
//Below will return you the max
$dataPoints = array(
array('x' => 2343, 'y' => 4322),
array('x' => 103, 'y' => 7303 ),
array('x' => 2345,'y' => 2321 ),
array('x' => 310, 'y' => 2044 ),
array('x' => 173, 'y' => 793 ),
array('x' => 456, 'y' => 2675),
array('x' => 24, 'y' => 819 ));
foreach ($dataPoints as $key=>$value) {
$x[$key] = $value['x'];
$y[$key] = $value['y'];
}
rsort($x,SORT_DESC);
rsort($y,SORT_DESC);
echo $x[0];
echo $y[0];
Sample code to built your required answer
foreach($dataPoints[0]['x'] as $x_val)
{
//write max min func for x values
}
foreach($dataPoints[0]['y'] as $y_val)
{
//write max min func for y values
}
In case you don't know how deep the array goes, and you know the maximum value the array holds (or set an arbitrary high number (SESSION Variable or any other)you can try this for the minimum:
function get_Min_Multi_Array($array) { foreach ($array as $key => $key_value) {
is_array(($key_value)) ? get_min_Multi_Array($key_value) : "";
if ($key_value < $_SESSION["min_array_value"] && $key_value != 0) {
$_SESSION["min_array_value"] = $key_value;
}
}
}
精彩评论