Php 在进入循环之前对foreach中的值应用函数
我认为这根本不可能,但希望我能被证明是错的 我想从下面获得一行“Php 在进入循环之前对foreach中的值应用函数,php,Php,我认为这根本不可能,但希望我能被证明是错的 我想从下面获得一行“不起作用””: <?php // Note, this is purposely an overly simplistic example // Pretend that I do not control this array and it is // provided to me from the database or an API or something $data_array = [ ' a ',
不起作用”
”:
<?php
// Note, this is purposely an overly simplistic example
// Pretend that I do not control this array and it is
// provided to me from the database or an API or something
$data_array = [
' a ',
' b ',
' c '
];
$new_array = [];
// Apply a function call before entering the loop
// foreach( $array as trim( $v ) ) // does not work
// foreach( $array as $v = trim( $v ) ) // does not work
foreach( $data_array as $v ) // works but I don't want this
{
$v = trim( $v ); // works but I don't want this
$new_array[ $v ] = $v;
}
var_dump( $new_array );
如果存在多个空格,您还可以在转到for循环以删除空格之前执行str_replace
:
$str = str_replace(' ', '', $str);
foreach(explode(',', $str) as $v) {
// ...
但这对以下类型的字符串不起作用:
$str = "a a , b , c";
// str_replace will result in
// "aa,b,c"
编辑:现在您已经更新了问题:
$array = [
' a ',
' b ',
' c '
];
$array = array_map('trim', $array);
$result = array_combine($array, $array);
var_dump($array);
简单且适用于只接受一个参数的函数:
foreach(array_map('trim', $array) as $v) {
$array[$v] = $v;
}
但是,要实现没有整数键的新字符串键,需要unset
it:
foreach(array_map('trim', $array) as $k => $v) {
unset($array[$k]);
$array[$v] = $v;
}
循环的备选方案:
$array = array_combine($v = array_map('trim', $array), $v);
要通过引用实际修改值,需要重新分配数组:
foreach($array = array_map('trim', $array) as &$v) {
$v = $v.' woo!';
}
尽管如此,您已经展示了实现结果的最有效、可能也是最具可读性的方法:
foreach($array as $v) {
$v = trim($v);
$array[$v] = $v;
}
您正在搜索
foreach($key=>$value
),您的行是$array |$key]=$v
@pierreemanuellallemant非常感谢您抽出时间,但请重新阅读问题。在进入循环之前,我想将trim()
应用于$v
。谢谢。foreach(数组映射(函数($v){return trim($v);},explode(',',$str))为$v)
或更短:foreach(数组映射(explode(',',$str),'trim')为$v)
我很难理解你为什么说“行,但我不想要这个”-1行代码-它如何影响你的工作?假装我不控制阵列的构建方式。请参阅我更新的问题。这可能是最接近我想象的问题,但不幸的是,如果在循环中使用并修改as&$v
,则无法正常工作。键的分配并不重要,但要感谢后面的两个示例。如果您可以使用as&$v
给出一个示例,以及它是如何工作的,我可以检查。此解决方案在数组中使用了两次。数组映射是一个循环。它以牺牲效率为代价来实现语法上的糖分。@Abracadverforeach(array_map('trim',$array)as&$v{$v=$v.'woo!'}
使$array
的值保持不变。@ryantxr:是的,他们已经知道有效的方法,但似乎正在寻找另一种方法。
foreach($array = array_map('trim', $array) as &$v) {
$v = $v.' woo!';
}
foreach($array as $v) {
$v = trim($v);
$array[$v] = $v;
}