foreachなし、このように配列を変えるには
array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");
このような文字列に
item1='object1', item2='object2',.... item-n='object-n'
すでにimplode()
について考えていましたが、それでキーが破裂することはありません。
Foreachが必要な場合、foreachをネストしないことは可能ですか?
編集:文字列を変更しました
EDIT2/UPDATE:この質問はかなり前に尋ねられました。そのとき、私はすべてを1行で書きたかったので、foreachを優先して、三項演算子とネストされた関数呼び出しを使用しました。それは良い習慣ではありませんでした!簡潔であるかどうかに関係なく、読みやすいコードを記述してください。
この場合:関数にforeachを置くことは、1行のライナーを書くよりもはるかに読みやすく、モジュール式になります(すべての答えは素晴らしいですが!)。
そして別の方法:
$input = array(
'item1' => 'object1',
'item2' => 'object2',
'item-n' => 'object-n'
);
$output = implode(', ', array_map(
function ($v, $k) {
if(is_array($v)){
return $k.'[]='.implode('&'.$k.'[]=', $v);
}else{
return $k.'='.$v;
}
},
$input,
array_keys($input)
));
または:
$output = implode(', ', array_map(
function ($v, $k) { return sprintf("%s='%s'", $k, $v); },
$input,
array_keys($input)
));
次のように http_build_query を使用できます。
<?php
$a=array("item1"=>"object1", "item2"=>"object2");
echo http_build_query($a,'',', ');
?>
出力:
item1=object1, item2=object2
測定(100000回の繰り返し)に費やしたが、連想配列を接着する最速の方法は何ですか?
目的:次の形式で1,000アイテムの行を取得するには: "key:value、key2:value2"
配列があります(たとえば):
$array = [
'test0' => 344,
'test1' => 235,
'test2' => 876,
...
];
テスト番号1:
http_build_queryおよびstr_replaceを使用します。
str_replace('=', ':', http_build_query($array, null, ','));
1000個の要素を分解する平均時間:0.00012930955084904
テスト番号2:
array_mapおよびimplodeを使用します。
implode(',', array_map(
function ($v, $k) {
return $k.':'.$v;
},
$array,
array_keys($array)
));
1000個の要素を分解する平均時間:0.0004890081976675
テスト番号3:
array_walkおよびimplodeを使用します。
array_walk($array,
function (&$v, $k) {
$v = $k.':'.$v;
}
);
implode(',', $array);
1000個の要素を分解する平均時間:0.0003874126245348
テスト番号4:
foreachを使用します。
$str = '';
foreach($array as $key=>$item) {
$str .= $key.':'.$item.',';
}
rtrim($str, ',');
1000個の要素を分解する平均時間:0.00026632803902445
私は、配列を接着する最良の方法-http_build_queryとstr_replaceを使用すると結論付けることができます
serialize()
またはjson_encode()
を使用します。
希望する正確な結果文字列は得られませんが、後でエンコード/保存/取得/デコードする方がはるかに簡単です。
array_walk の使用
$a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n");
$r=array();
array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";'));
echo implode(', ', $r);
変化する
- return substr($result, (-1 * strlen($glue)));
+ return substr($result, 0, -1 * strlen($glue));
最後の$ glueなしで文字列全体を復元したい場合
function key_implode(&$array, $glue) {
$result = "";
foreach ($array as $key => $value) {
$result .= $key . "=" . $value . $glue;
}
return substr($result, (-1 * strlen($glue)));
}
そして使用法:
$str = key_implode($yourArray, ",");
デバッグ用。ネストされた配列の配列を再帰的に文字列に書き込みます。 foreachに使用されます。関数は各国語の文字を保存します。
function q($input)
{
$glue = ', ';
$function = function ($v, $k) use (&$function, $glue) {
if (is_array($v)) {
$arr = [];
foreach ($v as $key => $value) {
$arr[] = $function($value, $key);
}
$result = "{" . implode($glue, $arr) . "}";
} else {
$result = sprintf("%s=\"%s\"", $k, var_export($v, true));
}
return $result;
};
return implode($glue, array_map($function, $input, array_keys($input))) . "\n";
}
PHPの array_reduce も使用できますが、
$a = ['Name' => 'Last Name'];
function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}
$imploded = array_reduce(array_keys($a), "acc");
Mysql where配列の条件を作成する場合
$sWheres = array('item1' => 'object1',
'item2' => 'object2',
'item3' => 1,
'item4' => array(4,5),
'item5' => array('object3','object4'));
$sWhere = '';
if(!empty($sWheres)){
$sWhereConditions = array();
foreach ($sWheres as $key => $value){
if(!empty($value)){
if(is_array($value)){
$value = array_filter($value); // For remove blank values from array
if(!empty($value)){
array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string'
$sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value));
}
}else{
$sWhereConditions[] = sprintf("%s='%s'", $key, $value);
}
}
}
if(!empty($sWhereConditions)){
$sWhere .= "(".implode(' AND ', $sWhereConditions).")";
}
}
echo $sWhere; // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))
var_export および print_r もありますが、デバッグ出力の印刷でよく知られていますが、両方の関数はオプションの引数を取り、代わりに文字列を返すことができます。
質問からの例をデータとして使用します。
$array = ["item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"];
print_r
を使用して配列を文字列に変換するこれにより、人間が読める変数の表現が出力されます。
$string = print_r($array, true);
echo $string;
出力されます:
Array
(
[item1] => object1
[item2] => object2
[item-n] => object-n
)
var_export
を使用して配列を文字列に変換する変数のPHP文字列表現を出力します。
$string = var_export($array, true);
echo $string;
出力されます:
array (
'item1' => 'object1',
'item2' => 'object2',
'item-n' => 'object-n',
)
有効なphpであるため、評価できます。
eval('$array2 = ' . var_export($array, true) . ';');
var_dump($array2 === $array);
出力:
bool(true)
クラスを使用した簡単な例を次に示します。
$input = array(
'element1' => 'value1',
'element2' => 'value2',
'element3' => 'value3'
);
echo FlatData::flatArray($input,', ', '=');
class FlatData
{
public static function flatArray(array $input = array(), $separator_elements = ', ', $separator = ': ')
{
$output = implode($separator_elements, array_map(
function ($v, $k, $s) {
return sprintf("%s{$s}%s", $k, $v);
},
$input,
array_keys($input),
array_fill(0, count($input), $separator)
));
return $output;
}
}