Php Array сортировка ассоциированного ключа после пересекающегося ключа

В настоящее время у меня есть это:

$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 без жесткого кодирования ключей.

2

Решение

Так как ты уже разобрался array_intersect_key метод, который не даст вам желаемый порядок ключей $ pattern, попробуйте вместо этого:

// 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>';
3

Другие решения

Вы знаете, я не уверен, как вы получаете результат, который вы описываете. Я попробовал твой код и получаю

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