开发者

PHP Arrays - Getting all the related ones based on value

开发者 https://www.devze.com 2023-03-31 09:01 出处:网络
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

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_filterDocs.

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);
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号