2012-08-13 24 views

risposta

8

Prova questa:

$filtred = array(); 

foreach($yourArray as $key => $value) 
    if(preg_match('/c_\d/',$key)) 
    $filtred[] = $value; 

print_r($filtred); 
+0

Soluzione piacevole e in contanti. –

+1

Penso che array_filter() sia una soluzione migliore. – Robert

2

Puoi provare a utilizzare array_filter().

Ci sono alcuni esempi interessanti su php documentation page. Uno di questi copre il filtraggio delle chiavi dell'array.

3

Try This

//your array 
    $arr1 = array (
      "y" => 35, 
      "x" => 51, 
      "z" => 35, 
      "c_3" => 4, 
      "c_1" => 54, 
      "c_6" => 53, 
      "c_9" => 52 
    ); 
// Array with keys you want 
    $arr2 = array (
      "c_3" => '', 
      "c_1" => '', 
      "c_6" => '', 
      "c_9" => '' 
    ); 
//use array_intersect_key to find the common ;) 
    print_r(array_intersect_key($arr1,$arr2)); 
+0

Bello, non conoscevo quel comando. Per chi vuole maggiori informazioni su array_intersect_key: http://php.net/manual/en/function.array-intersect-key.php –

1

realtà ho avuto domanda e belvedere simile per le risposte qui, ma niente di veramente abbinato le mie aspettative.

volevo qualcosa di più riutilizzabile, che ho potuto usare in tutti i miei progetti, così ho finito per scrivere questa funzione:

/** 
* Create a new a array containing only the key with a certain $pattern or $subString. 
* 
* Note: You cannot use both $subString and $pattern at once ($substring has precedence on $pattern). 
* 
* @param $errorMessage String to return the error message. 
* @param $source Array in which we must extract data. 
* @param $subString String/Int/Array substring (or array of substring) to seek in the key name. 
* @param $pattern String regex for validating the key. 
* @param $useValueAsKey Boolean if true it will use the value as the key in the new array (scalar values only). 
*/ 
public static function extractSubArray(&$errorMessage, array &$source, $subString ="", $pattern = "", $useValueAsKey=false){ 

    $newArray = array(); 

    $errorMessage = ""; 

    $dbManager = GeneralDbManager::getInstance(); 

    if (empty($source)){ 

     $errorMessage = $dbManager->getErrorMessage("SOURCE_ARRAY_IS_EMPTY_ERR", "The array supplied is empty."); 
    } 
    elseif(empty($subString) and empty($pattern)){ 

     $errorMessage = $dbManager->getErrorMessage("NO_SUBSTR_OR_PATTERN_ERR", "There are no substring or pattern to match the keys in the array."); 
    } 
    elseif (!empty($subString) and !(is_string($subString) or is_numeric($subString) or is_array($subString))){ 

     $errorMessage = $dbManager->getErrorMessage("INVALID_MATCH_SUBSTRING_ERR", "The substring you supplied to match the keys is invalid."); 
    } 
    elseif(!empty($pattern) and !RegularExpression::testRegex($pattern)){ 

     $errorMessage = $dbManager->getErrorMessage("INVALID_MATCH_PATTERN_ERR", "The regular expression you supplied to match the keys is invalid."); 
    } 
    else{ 

     foreach ($source as $key => $value){ 

      if (self::isKeyMatchSubstring($key, $subString, $pattern)){ 

       if ($useValueAsKey and (is_string($value) or is_numeric($value))){ 

        $newArray[$value] = $value;  
       } 
       else{ 

        $newArray[$key] = $value; 
       } 
      }  
     } 

     if (empty($newArray)){ 

      $errorMessage = $dbManager->getErrorMessage("INVALID_MATCH_PATTERN_ERR", "We were not able to match any keys in the array with the substring or the regular expression."); 
     } 
    } 

    unset($dbManager); 

    return $newArray; 
} 

/** 
* Validate that the $key contains the $substring (string or array) or match the $pattern. 
* 
* @param $key String to validate 
* @param $subString String/Int/Array containing the subString to seek. 
* @param $pattern String regex for validating the key. 
*/ 
private static function isKeyMatchSubstring($key, $subString, $pattern){ 

    $matched = false; 

    if (!empty($subString)){ 

     if (is_string($subString) or is_numeric($subString)){ 

      if(strpos(strtolower($key), strtolower($subString)) !== false){ 

       $matched = true;  
      } 
     } 
     else{ //array 

      foreach($subString as $testString){ 

       $matched = self::isKeyMatchSubstring($key, $testString, ""); 

       if ($matched){ 

        break; 
       } 
      } 
     } 
    } 
    elseif(!empty($pattern)){ 

     $matched = preg_match($pattern, $key); 
    } 

    return $matched; 
} 

utilizza una funzione denominata testRegex(), quindi credo che posso fornire anche questo codice:

/** 
* Make sure that a regular expression works in PHP. 
* 
* @param $regex String the regular expression to validate. 
* 
* @return Boolean 
*/ 
public static function testRegex($regex){ 

    $isValid = false; 

    if (!empty($regex) and is_string($regex)){ 

     if (@preg_match($regex, null) !== false){ 
      $isValid = true; 
     } 
    } 

    return $isValid; 
} 

E, naturalmente, quanto sarebbe buona una funzione senza test di unità?

public function testExtractSubArray(){ 

    $errorMessage = ""; 

    $source = array(); 

    //no data 
    $this->assertEmpty(Tool::extractSubArray($errorMessage, $source, "", "", false)); 

    $this->assertNotEmpty($errorMessage); 

    //no substring or pattern 
    $source = array(1 => 1); 


    $this->assertEmpty(Tool::extractSubArray($errorMessage, $source, "", "", false)); 

    $this->assertNotEmpty($errorMessage); 


    //invalid substring 
    $dbmanager = GeneralDbManager::getInstance(); 

    $this->assertEmpty(Tool::extractSubArray($errorMessage, $source, $dbmanager, "", false)); 

    $this->assertNotEmpty($errorMessage); 

    unset($dbmanager); 


    //invalid pattern 
    $this->assertEmpty(Tool::extractSubArray($errorMessage, $source, "", "[]123", false)); 

    $this->assertNotEmpty($errorMessage); 


    //no match 
    $this->assertEmpty(Tool::extractSubArray($errorMessage, $source, "pokemon", "", false)); 

    $this->assertNotEmpty($errorMessage); 


    //valid substring 
    $source = array("woot1" => "homer", "woot2" => "bart", "woot3" => "lisa", "doh1" => "marge", "doh2" => "simpson"); 

    $newArray = Tool::extractSubArray($errorMessage, $source, "WOOT", "", false); 


    $this->assertNotEmpty($newArray); 

    $this->assertEmpty($errorMessage); 

    $this->assertContains("homer", $newArray); 

    $this->assertContains("bart", $newArray); 

    $this->assertContains("lisa", $newArray); 

    $this->assertNotContains("marge", $newArray); 

    $this->assertNotContains("simpson", $newArray); 


    //use value as key 
    $newArray = Tool::extractSubArray($errorMessage, $source, "WOOT", "", true); 


    $this->assertTrue(array_key_exists("homer", $newArray)); 

    $this->assertTrue(array_key_exists("bart", $newArray)); 

    $this->assertTrue(array_key_exists("lisa", $newArray)); 


    //substring array 
    $source = array("stan_march" => "normal", "kyle_brofloski" => "jew", "eric_cartman" => "asshole", "kenny_mccormick" => "dead", "butters_stotch" => "pushover"); 

    $newArray = Tool::extractSubArray($errorMessage, $source, array("stan", "kyle", "cartman"), "", false); 


    $this->assertNotEmpty($newArray); 

    $this->assertEmpty($errorMessage); 

    $this->assertContains("normal", $newArray); 

    $this->assertContains("jew", $newArray); 

    $this->assertContains("asshole", $newArray); 

    $this->assertNotContains("dead", $newArray); 

    $this->assertNotContains("pushover", $newArray); 


    //regex 
    $source = array("[email protected]" => 1, "jonathan" => 2, "12345" => 3, "more $$$" => 4, "$?%$?%$%?" => 5); 

    $newArray = Tool::extractSubArray($errorMessage, $source, "", RegularExpression::ALPHA_NUMERIC, false); 


    $this->assertNotEmpty($newArray); 

    $this->assertEmpty($errorMessage); 

    $this->assertNotContains(1, $newArray); 

    $this->assertContains(2, $newArray); 

    $this->assertContains(3, $newArray); 

    $this->assertNotContains(4, $newArray); 

    $this->assertNotContains(5, $newArray); 
} 

Nota aggiuntiva: Questo codice utilizza GetErrorMessage() metodo per recuperare la traduzione del messaggio di errore nel database. Poiché questi messaggi di errore sono pensati per scopi di debug, possono essere codificati direttamente nel codice per aumentare le prestazioni (non è necessario creare un'istanza della classe per recuperare il messaggio di errore e aprire una connessione al database).

Beh, spero che possa aiutare qualche maniaco della riusabilità come me.

Jonathan Parent-Lévesque da Montreal

2

controllare questa soluzione con array_filter()

$arr = [ 
    'y' => 35, 
    'x' => 51, 
    'z' => 35, 
    'c_3' => 4, 
    'c_1' => 54, 
    'c_6' => 53, 
    'c_9' => 52, 
]; 

$filtered = array_filter($arr, function($v) use($arr){ 
    return preg_match('#c_\d#', array_search($v, $arr)); 
}); 

soluzione qui di seguito lavorerà in PHP> = 5.6.0

$filtered = array_filter($arr, function($k){ 
    return preg_match('#c_\d#', $k); 
}, ARRAY_FILTER_USE_KEY); 

Entrambe le soluzioni lavoro che ho li ha controllati

Problemi correlati