我的网站上有以下函数,它从$vid_pix
中获取所有值,并在foreach
循环中回显每个值或任何关联的变量。
这工作正常,但是我有一个变量 -$Pt
它也会被回显出来。
现在,尽管我要做的是 - 跳过$Pt
中的第一个值。还要为最后一个实例设置一个静态值,因为所有内容都向上移动 1,而最后一个实例则没有值。
我已经尝试了array_splice
和unset
,但它并没有跳过第一个$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_pix
的photo_time
,在您的问题中,我看到您需要获取当前vid_pix
的下一个vid_pix
photo_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