Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在进入循环之前对foreach中的值应用函数_Php - Fatal编程技术网

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
给出一个示例,以及它是如何工作的,我可以检查。此解决方案在数组中使用了两次。数组映射是一个循环。它以牺牲效率为代价来实现语法上的糖分。@Abracadver
foreach(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;
}