跳过 foreach 循环 PHP 内部变量的第一个值



我的网站上有以下函数,它从$vid_pix中获取所有值,并在foreach循环中回显每个值或任何关联的变量。

这工作正常,但是我有一个变量 -$Pt它也会被回显出来。

现在,尽管我要做的是 - 跳过$Pt中的第一个值。还要为最后一个实例设置一个静态值,因为所有内容都向上移动 1,而最后一个实例则没有值。

我已经尝试了array_spliceunset,但它并没有跳过第一个$Pt值。

所以如果我有——

[vp 1]->[5]
[vp 2]->[10]
[vp 3]->[15]
[vp 4]->[20]

我需要——

[vp 1]->[10]
[vp 2]->[15]
[vp 3]->[20]
[vp 4]->[x]

(x = 我必须为最后一个变量分配一个静态值。

我的函数(为简单起见进行了精简(

$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
array_splice($Pt, 0, 1);
//unset($Pt[0]);
$Pt = get_post_meta($vP, 'photo_time', true);
echo $Pt;
if (last -> $Pt) { // something like this for the last value
$Pt = '5';
}
}

为了更好地理解上下文,以下是我尝试在其中实现的特定函数的完整代码 -

/*
This is for looping through the uploaded pictures
and sorting them and creating a text file.
*/
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
$data = "ffconcat version 1.0";
$line = '';
usort( $vid_pix, function( $a, $b ){
$aPor = (int) get_post_meta( $a, 'photo_order', true );
$bPor = (int) get_post_meta( $b, 'photo_order', true );
if ( $aPor === $bPor ) {
return 0;
}
return ( $aPor < $bPor ) ? -1 : 1;
} );
foreach ($vid_pix as $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = get_post_meta($vP, 'photo_time', true);
$Por = get_post_meta($vP, 'photo_order', true);
$static_value=25;
$array=$Pt;
reset($array);//reset the internal pointer
while(false!==($key=key($array))&&null!==key($array)){//check for current key validity
$next=next($array);//get the next value and move the pointer
$array[$key]=$next&&isset($array[$key])?$next:$static_value;//assign the next value to the current key  if valid or the static value if false 
}
var_dump($Por);
var_dump($array);
// try to determine the pic of the placeholder image
if ($vP === end($vid_pix))
$last_img = $thepath.'/'.$filename;

if ($vstyle === 'Custom') { // if custom timing is chosen
$slide_dur = "rnduration ".$Pt;
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."rn";

} else { // if custom timing is NOT chosen
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."rn";
}
$total_items = count($vid_pix);
if ($total_items > 1) { // if total items is more than one
// LAST LINE OF CONCAT TEXT FILE
$lastline = "file '".$last_img."'rnduration 2rnfile '".$last_img."'";
$isitone = "";
$solopic = "";

// PUT TOGETHER ALL THE LINES FOR THE TEXT FILE
$txtc = $data."rn".$line.$lastline;
} else { // if total items is less than one
$isitone = "true";
$solopic = "-loop 1 -probesize 10M -i ".$thepath."/".$filename;
}
}
// SAVE THE TEXT FILE
file_put_contents($thepath.'/paths.txt', $txtc);

更新

var_dump结果 -

string(1) "7"
string(1) "2"
string(1) "6"
string(1) "9"

以下链接包含保存$Pt变量的原始代码 - 这里

更新 #1

尝试使用这样的array_shift()

foreach ($vid_pix as $vP) {
$Pt2 = get_post_meta($vP, 'photo_time', false);
$Pt = array_shift( $Pt2 ); // get first value
$Pt2[] = 'static value';
var_dump( $Pt, $Pt2 ); // test
}

更新 #2

如果每个图像/附件实际上只有一个photo_time元(附件 ID 在$vid_pix数组中(,那么这应该有效:

$Pt2 = [];
$n = count( $vid_pix );
for ( $i = 0, $j = 1; $i < $n; $i++, $j++ ) {
$Pt2[] = ( $n === $j ) ? 'static value' :
get_post_meta( $vid_pix[ $j ], 'photo_time', true );
}
echo implode( ', ', $Pt2 ); // test

更新 #3

在此foreach上方/之前添加上述($Pt2(代码,然后添加$i =>,并更改$Pt,如下所示:

foreach ($vid_pix as $i => $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = $Pt2[ $i ];
...
}

根据 OP 的注释,$Pt是一个数组数组。所以我们简单地使用 array_shift 来删除第一个值(二级数组(。并且,将静态值数组附加到末尾:

$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
// $Pt is an array of array
// remove the first key (first array)
$first_key = array_shift($Pt);
// Add the static value to end of the array. eg: '5'
$static_value = '5'; // define static value
$Pt[] = array($static_value);
// print them out
var_dump($Pt);
}

为什么不以最简单的方式做到这一点呢?

$keys = array_keys($myHashArray);
$values = array_values($myHashArray);
array_shift($keys);
array_shift($values);
$result = array_combine($keys, $values);

如果我理解错误,请纠正我。

您可以简单地进行如下操作:

$static_value=25;
$array=['vp 1'=>5,'vp 2'=>10,'vp 3'=>15,'vp 4'=>20];
reset($array);//reset the internal pointer
while(false!==($key=key($array))&&null!==key($array)){//check for current key validity
$next=next($array);//get the next value and move the pointer
$array[$key]=$next&&isset($array[$key])?$next:$static_value;//assign the next value to the current key  if valid or the static value if false 
}

var_dump($array);

输出:

array(4) {
["vp 1"]=>
int(10)
["vp 2"]=>
int(15)
["vp 3"]=>
int(20)
["vp 4"]=>
int(25)
}

怎么样?

$new_array = array_combine( // to make an array from $keys / values
array_keys($old_array), // use the old same keys
array_merge( // the array containing your new values
array_splice($old_array, 1), // remove the first element
[$static_value] // add the static value
)
);

在这里现场检查:https://repl.it/repls/PerfectUpsetAnalysts

$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
$i = 0;
foreach ($vid_pix as $vP) {
if($i ==0){
continue;
}
$Pt = get_post_meta($vP, 'photo_time', false);
array_splice($Pt, 0, 1);
//unset($Pt[0]);
$Pt = get_post_meta($vP, 'photo_time', true);
echo $Pt;
if (last -> $Pt) { // something like this for the last value
$Pt = '5';
}
$i++;
}

使用此类型的计数器跳过值...。

正如您已经知道的那样,您正在获得每个vid_pixphoto_time,在您的问题中,我看到您需要获取当前vid_pix的下一个vid_pixphoto_time并忽略第一个photo_time,即提供示例中的 5 和最后一个vid_pix(放置一些静态的东西(

[vp 1]->[5]
[vp 2]->[10]
...

我需要——

[vp 1]->[10]
[vp 2]->[15]
...

所以我认为它很简单(我用vip_pix index作为键,你可以使用任何东西(

$pt_result = [];
for ($i = 0; $i < count($vid_pix) - 1; ++$i) {
$pt_result[$vid_pix[$i]] = get_post_meta($vid_pix[$i+1], 'photo_time', true);
}
$pt_result[$vid_pix[$i]] = 25; //set last one statically

您需要将数组移出循环,因为$Pt数组具有单个值。尝试下面给出的代码。

$newPt = array(); // initialize new array
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
// assign to new array
$newPt[] = $Pt;
}
// remove first value
array_shift( $newPt );
// add static value to end of the array
$static = '5';
$newPt[] = array( $static );
// print updated array
var_dump($newPt);

希望这有帮助。

如何将get_post_meta($vP, 'photo_time', false);的结果传递到一个函数中,该函数将值移位并将静态值添加到末尾?

function shiftPt($input, $end = null) {
$output = [];
$prevKey = null;
foreach ($input as $key => $value) {
if ($lastKey) $output[$lastKey] = $value;
$lastKey = $key;
}
$output[$key] = $end;
return $output;
}

所以基本上你可以像这样包装你现有的函数......

$pT = shiftPt(get_post_meta($vP, 'photo_time', false));

。这会将数组中的最后一个值保留为 null,同时将所有原始值向上移动。

如果您想指定最终值(例如5(,那么您可以...

$pT = shiftPt(get_post_meta($vP, 'photo_time', false), 5);

您可以使用array_slice从数组中删除一组值,并使用array_merge将其与"x"合并。

然后,您只需组合键和"新"值即可。

$arr = [
'vp 1'=>[5],
'vp 2'=>[10],
'vp 3'=>[15],
'vp 4'=>[20]];
$keys = array_keys($arr);
$values = array_merge(array_slice($arr, 1), ["x"]);
$new = array_combine($keys, $values);
var_dump($new);

这输出:

array(4) {
["vp 1"]=>
array(1) {
[0]=>
int(10)
}
["vp 2"]=>
array(1) {
[0]=>
int(15)
}
["vp 3"]=>
array(1) {
[0]=>
int(20)
}
["vp 4"]=>
string(1) "x"
}

https://3v4l.org/l7NBa

相关内容

最新更新