2011-06-01 89 views
3

我使用array_filter做這樣的事情:array_filter與assoc數組?

function endswithy($value) { 
    return (substr($value, -1) == 'y'); 
} 

$people = array("Johnny", "Timmy", "Bobby", "Sam", "Tammy", "Danny", "Joe"); 
$withy = array_filter($people, "endswithy"); 
var_dump($withy); 

但在過濾器例如更多選項

$people = array(
      "Johnny"=>array("year"=>1989, "job"=>"prof"), 
      "Timmy"=>array("year"=>1989, "job"=>"std"), 
      "Bobby"=>array("year"=>1988), 
      "Sam"=>array("year"=>1983), 
      "Tammy"=>array("year"=>1985), 
      "Danny"=>array("year"=>1983), 
      "Joe"=>array("year"=>1989,"job"=>"prof")); 

OR

$people = array(
      array("name"=>"Johnny","year"=>1989, "job"=>"prof"), 
      array("name"=>"Timmy","year"=>1989, "job"=>"std"), 
      array("name"=>"Bobby""year"=>1988), 
      array("name"=>"Sam","year"=>1983), 
      array("name"=>"Tammy","year"=>1985), 
      array("name"="Danny","year"=>1983), 
      array("name"="Joe","year"=>1989,"job"=>"prof")); 

我怎樣才能得到只有這人(可以使用yyear=1989job=prof),我可以使用array_filter嗎? 或任何內置函數來做到這一點?

$people = array(
       "Johnny"=>array("year"=>1989, "job"=>"prof") 
); 

OR

$people = array(
       array("name="Johnny","year"=>1989, "job"=>"prof") 
); 
+0

你可以使用name作爲* inner *數組的值而不是* outer *數組的鍵嗎?即,'$ people = array(array('name'=>'Johnny','year'=> 1989,'job'=>'prof'),...)' – binaryLV 2011-06-01 10:15:17

+0

是的,我可以隨心所欲 – newbie 2011-06-01 10:17:46

+0

如果你能做到,那麼使用'array_filter()'沒有問題。你會得到數組作爲回調函數的參數('endswithy()'),所以你可以檢查名字和年份。如果你只需要一次,你也可以使用'foreach'循環去除不需要的項目。我在下面的答案中給出了'array_filter()'和'foreach'的例子。 – binaryLV 2011-06-01 10:24:48

回答

3

要麼使用foreach與當前陣列的結構:

$people = array(
    "Johnny" => array("year" => 1989, "job" => "prof"), 
    "Timmy" => array("year" => 1989, "job" => "std"), 
    "Bobby" => array("year" => 1988), 
    "Sam" => array("year" => 1983), 
    "Tammy" => array("year" => 1985), 
    "Danny" => array("year" => 1983), 
    "Joe" => array("year" => 1989, "job" => "prof"), 
); 

foreach ($people as $name => $info) { 
    if (substr($name, -1) !== 'y' || $info['year'] != 1989) { 
     unset($people[$name]); 
    } 
} 

print_r($people); 

// output: 
Array 
(
    [Johnny] => Array 
     (
      [year] => 1989 
      [job] => prof 
     ) 
    [Timmy] => Array 
     (
      [year] => 1989 
      [job] => std 
     ) 
) 

或轉換您的陣列,這樣的名字是陣列的價值:

$people = array(
    array('name' => 'Johnny', 'year' => 1989, 'job' => 'prof'), 
    array('name' => 'Timmy' , 'year' => 1989, 'job' => 'std'), 
    array('name' => 'Bobby' , 'year' => 1988), 
    array('name' => 'Sam' , 'year' => 1983), 
    array('name' => 'Tammy' , 'year' => 1985), 
    array('name' => 'Danny' , 'year' => 1983), 
    array('name' => 'Joe' , 'year' => 1989, 'job' => 'prof'), 
); 

function filter($item) { 
    return substr($item['name'], -1) === 'y' && $item['year'] == 1989; 
} 

$filteredPeople = array_filter($people, 'filter'); 

print_r($filteredPeople); 

// output: 
Array 
(
    [0] => Array 
     (
      [name] => Johnny 
      [year] => 1989 
      [job] => prof 
     ) 
    [1] => Array 
     (
      [name] => Timmy 
      [year] => 1989 
      [job] => std 
     ) 
) 
+0

在第二個例子中,爲什麼我們需要轉換$ people數組?它是array_filter的限制嗎? – newbie 2011-06-01 10:27:47

+0

不,它不是'array_filter()'的限制。如果在過濾後不需要'$ people',則可以安全地將結果賦值給'$ people',即'$ people = array_filter($ people,'filter');'。 – binaryLV 2011-06-01 10:37:52

+0

對不起,binaryLV你的代碼工作完美,但我不明白,你在這裏的評論中解釋了什麼。可以給你更多的例子。非常感謝。 – newbie 2011-06-01 10:58:34

3

PHP 5.6 introduces可選的標誌ARRAY_FILTER_USE_KEY,將允許這樣的:

function endswithy($name) { 
    return (substr($name, -1) == 'y'); 
} 

$people = array(
    "Johnny"=>array("year"=>1989, "job"=>"prof"), 
    "Timmy"=>array("year"=>1989, "job"=>"std"), 
    "Bobby"=>array("year"=>1988), 
    "Sam"=>array("year"=>1983), 
    "Tammy"=>array("year"=>1985), 
    "Danny"=>array("year"=>1983), 
    "Joe"=>array("year"=>1989,"job"=>"prof") 
); 

$peopleEndingInY = array_filter($people, 'endswithy', ARRAY_FILTER_USE_KEY); 

// Outputs: 5 
var_dump(count($peopleEndingInY)); 

如果您需要維護和鍵和值,另一種標誌ARRAY_FILTER_USE_BOTH會做,因爲看到這個例子:

$ar = array(
    'key1' => 'value1', 
    'key2' => 'value2' 
); 

//Note that this doens't actually filter anything since it doesn't return a bool. 
$output = array_filter($ar, function($value, $key){ 
    echo sprintf("%s => %s\n", $key, $value); 
}, ARRAY_FILTER_USE_BOTH);