我有例如数组
$myArray = [
'id' => 1,
'code' => '1234',
'translation_lang_id' => 3,
'translation_name' => 'Lorem Ipsum',
'translation_description' => 'My content'
];
现在,我需要将其分为:首先是所有键和值,其中键以translation_
开头,其次是其余键,因此最终看起来应该像这样:
$translationArray = [
'translation_lang_id' => 3,
'translation_name' => 'Lorem Ipsum',
'translation_description' => 'My content'
];
$baseData = [
'id' => 1,
'code' => '1234',
];
有比循环更好的方法吗?
答案 0 :(得分:4)
您可以将array_filter
与ARRAY_FILTER_USE_KEY
标志一起使用,以根据键是否以'translation_'开头来分隔不同的元素:
$translationArray = array_filter($myArray,
function ($k) {
return substr($k, 0, 12) == 'translation_';
}, ARRAY_FILTER_USE_KEY);
$baseData = array_filter($myArray,
function ($k) {
return substr($k, 0, 12) != 'translation_';
}, ARRAY_FILTER_USE_KEY);
var_export($translationArray);
var_export($baseData);
输出:
array (
'translation_lang_id' => 3,
'translation_name' => 'Lorem Ipsum',
'translation_description' => 'My content',
)
array (
'id' => 1,
'code' => '1234',
)
答案 1 :(得分:4)
一种蛮力方法是仅迭代您的数组,然后将元素分配给适当的目标数组:
$translationArray = array();
$baseData = array();
foreach ($myArray as $key => $value) {
if (preg_match("/^translation_/", $key)) {
$translationArray[$key] = $value;
}
else {
$baseData[$key] = $value;
}
}
答案 2 :(得分:2)
您可以拔出您想要的一个键值,然后对原始数组进行差分以得到另一个。
<?php
$input = [
'id' => 1,
'code' => '1234',
'translation_lang_id' => 3,
'translation_name' => 'Lorem Ipsum',
'translation_description' => 'My content'
];
$translation = array_filter($input, function($k) {
return strpos($k, 'translation_') === 0;
}, ARRAY_FILTER_USE_KEY);
$base = array_diff_key($input, $translation);
var_dump($translation, $base);
输出:
array(3) {
["translation_lang_id"]=>
int(3)
["translation_name"]=>
string(11) "Lorem Ipsum"
["translation_description"]=>
string(10) "My content"
}
array(2) {
["id"]=>
int(1)
["code"]=>
string(4) "1234"
}
但是循环可能更易于阅读和遵循:
foreach($input as $k=>$v)
strpos($k, 'translation_') === 0
? $translation[$k]=$v
: $base[$k]=$v;
答案 3 :(得分:2)
搜索任何用str替换的字符串,并分批获取数据,
$str = "translation_";
$len = strlen($str); // upto length for fetching sub string
$translationArray = $baseData = [];
foreach ($input as $key => $value) {
if (substr($key, 0, $len) == $str) { // checking here
$translationArray[$key] = $value;
} else {
$baseData[$key] = $value;
}
}
答案 4 :(得分:1)
这不是一种有效的方法,只是为了好玩。
这是一个班轮:-)
$baseData = array_diff_key($myArray, $translationArray = array_intersect_key($myArray,array_flip(preg_grep("/^translation/", array_keys($myArray)))));
它在键上使用preg_grep,然后将它们与主数组中的array_intersect相匹配。
然后从$ translationArray将$ baseData创建为array_diff_key。