2015-11-22 74 views
2

目前我有這樣的:PHP數組排序assoc命令鍵後交叉鍵

$pattern = array('industry_id','category_id','subcategory_id'); 

$data = array('advert_id' => string '261501' (length=6) 
    'advert_type_id' => string '7' (length=1) 
    'user_id' => string '6221' (length=4) 
    'industry_id' => string '17' (length=2) 
    'category_id' => string '769' (length=3) 
    'subcategory_id' => string '868' (length=3) 
    'model' => string 'Custom Semi Drop Deck Trailer' (length=29) 
    'description' => string 'Industry: Trailer); 

然後:

array_intersect_key( $data , array_flip($pattern)); 

使用array_interect_key & array_flip$data獲取值基於$pattern,我會得到一個結果如下:

array (size=3) 
    'category_id' => string '769' (length=3) 
    'subcategory_id' => string '930' (length=3) 
    'industry_id' => string '17' (length=2) 

不幸的是,你可以看到結果鍵排序與我在$pattern中聲明的不同。有沒有簡單的方法來排序它,就像我在$pattern中聲明的那樣,因爲在此之後,我想破壞數組並在沒有對密鑰進行硬編碼的情況下執行類似industry_id.category_id.subcategory_id的操作。

回答

3

既然你已經想通了array_intersect_key方法,它不會讓你的$模式所需的鍵排序,試試這個來代替:

// since original $pattern is not ASSOC (only vals) 
// flip it so defined vals become keys 
$pattern_flipped = array_flip($pattern); 
$result = array(); 
foreach ($pattern_flipped as $k => $v) { 

    if (isset($data[$k])) { 
     $result[$k] = $data[$k]; 
    } 
} 
var_dump($result); // test 

// can use original 0 1 2 dynamic keys for concatenation 
echo $result[$pattern[0]], $result[$pattern[1]], $result[$pattern[2]], '<br>'; 
// or use hardcoded keys 
echo $result['industry_id'], $result['category_id'], $result['subcategory_id'], '<br>'; 
0

你知道我不知道你是怎麼得到你描述的結果。我試過你的代碼,我得到

array (size=3) 
    'industry_id' => string '17' (length=2) 
    'category_id' => string '769' (length=3) 
    'subcategory_id' => string '868' (length=3) 

雖然使用array_filter

$newData = array_filter($data, function($key) use ($pattern) { 
    if (in_array($key, $pattern)) 
     return true; 
}, ARRAY_FILTER_USE_KEY) 
+0

如果我沒有記錯_array_filter_方法將做比賽你可以做到這一點的另一種方式,並保存密鑰,但爲了原始的$ data數組,這不是他想要的。他希望_(如果我理解正確)_結果數組具有與$ pattern相同的鍵順序。一個簡單的方法用簡單的循環檢查我的答案。 –

+0

@IvanVeštićarray_filter按順序遍歷數據,因此無論模式的順序如何,它總是會按照原始數據的順序返回。這就是說,我也用OP的方法得到了正確的結果。你的循環也可以工作,這是我的首選問題(雖然我沒有比較處理速度) – dops

+0

@IvanVeštić對不起,只是看着它,我沒有讀你正確的評論,OP有他們的模式在順序的原始數據。我想他們想要按照原來的順序。 – dops