PHP Arrays - Getting all the related ones based on value
I have PHP array of arrays as below and I want to extract the arrays based on key "type" value. I mean for example in the below code want to extract based on
'type' => '1'
'type' => '2' ( There are two arrays for this condition)
'type' => '22' ( There are two arrays for this condition)
For this I am going each element in the for loop and combing the related ones . But is there any direct function available to do this ?
some thing like array.search(type value 2) giving the related two entries ..? ( because I have lot of types like this )
Thanks for your help
array
0 =>
array
'type' => string '1'
'code' => string '1'
'total_count' => string '200'
'car_count' => string '4'
1 =>
array
'type' => string '2'
'code' => string '52160'
'total_count' => string '100'
'car_count' => string '2'
2 =>
array
'type' => string '2'
'code' => string '26'
'total_count' => string '30'
'car_count' => string '15'
3 =>
array
'type' => string '20'
'code' => string '6880'
'total_count' => string '4'
'car_count' => string '0'
4 =>
array
'type' => string '21'
'code' => string '256'
'total_count' => string '10'
'car_count' => string '5'
5 =>
array
'type' => string '22'
'code' => string '20'
'total_count' => string '100'
'car_count' => string '8'
6 =>
array
开发者_运维知识库 'type' => string '22'
'code' => string '25'
'total_count' => string '120'
'car_count' => string '9'
You can formulate your condition inside a function that returns true
if an array element matches and false
if not.
You then use it as a callback with array_filter
Docs.
Example (type must be integer 2):
function myMatch($element)
{
return $element['type'] === 2;
}
$values = array_filter($array, 'myMatch');
Modify the function according to your needs. The input will be a single element.
Or if you prefer some interface on your array to be called with a specified constraint (Demo):
<?php
$array = array(
array('type' => '1'),
array('type' => '2'),
array('type' => '22'),
);
$compareValue = 'type';
$startsWith = '2';
$array = new OArray($array);
$compareValue = function($v) use ($compareValue)
{
return (string) $v[$compareValue];
};
$startsWith = function($value) use ($startsWith)
{
return 0 === strpos($value, $startsWith);
};
$constraint = function($element) use ($compareValue, $startsWith)
{
return $startsWith($compareValue($element));
};
var_dump(
$array->filter($constraint)
);
class OArray
{
/**
* @var Array
*/
private $array;
public function __construct($array)
{
$this->array = $array;
}
/**
* function based filter
*/
public function filter($function)
{
if (!is_callable($function))
throw new InvalidArgumentException('Invalid function given.');
return array_filter($this->array, $function);
}
}
But a more elegant variant would be to use a FilterIterator on the array that can take the arguments far nicer and is much more re-useable (Demo):
<?php
$array = array(
array('type' => '1'),
array('type' => '2'),
array('type' => '22'),
);
$filter = new ArrayElementStartsWithFilter($array, 'type', '2');
var_dump($filter->filter());
class ArrayElementStartsWithFilter extends FilterIterator
{
private $what;
private $with;
public function __construct(array $array, $what, $with)
{
$this->what = $what;
$this->with = $with;
parent::__construct(new ArrayIterator($array));
}
public function accept()
{
$element = $this->getInnerIterator()->current();
return !empty($element[$this->what])
&& 0 === strpos($element[$this->what], $this->with)
;
}
public function filter() {
return iterator_to_array($this);
}
}
精彩评论