我的网站上具有以下功能,该功能可从$vid_pix
中获取所有值,并在foreach
循环中分别 echos 每个值或任何关联的变量。
哪个工作正常,但是我有一个变量-$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 = "\r\nduration ".$Pt;
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."\r\n";
} else { // if custom timing is NOT chosen
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."\r\n";
}
$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."'\r\nduration 2\r\nfile '".$last_img."'";
$isitone = "";
$solopic = "";
// PUT TOGETHER ALL THE LINES FOR THE TEXT FILE
$txtc = $data."\r\n".$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
变量-here
答案 0 :(得分:1)
$Pt
基于OP's comments,是一个数组数组。因此,我们仅使用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);
}
答案 1 :(得分: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
}
如果每个图像/附件实际上只有一个 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
在此$Pt2
之前 /上方添加上述(foreach
)代码,然后添加$i =>
,并根据需要更改$Pt
可以看到以下内容:
foreach ($vid_pix as $i => $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = $Pt2[ $i ];
...
}
答案 2 :(得分:0)
为什么不以最简单的方式做到这一点?
List<SomeType> foo = cast(someObject);
如果我理解错了,请纠正我。
答案 3 :(得分:0)
您可以这样简单地进行:
$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)
}
答案 4 :(得分:0)
怎么样?
$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
)
);
答案 5 :(得分:0)
$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++;
}
使用这种类型的计数器跳过值。...
答案 6 :(得分:0)
您已经知道每个photo_time
都将获得vid_pix
,在我的问题中,我认为您需要为当前{{1}获得下一个photo_time
的{{1}} },并忽略第一个vid_pix
(在提供的示例中为5)和最后一个vid_pix
(改为使用静态内容)
photo_time
我需要-
vid_pix
所以我认为它很简单(我使用[vp 1]->[5]
[vp 2]->[10]
...
作为键,您可以使用任何东西)
[vp 1]->[10]
[vp 2]->[15]
...
答案 7 :(得分:0)
由于您的$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);
希望这会有所帮助。
答案 8 :(得分:0)
如何将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));
...,这会将数组中的最后一个值保留为空,同时将所有原始值上移。
如果您想指定最终值(例如5
),则可以...
$pT = shiftPt(get_post_meta($vP, 'photo_time', false), 5);
答案 9 :(得分:0)
您可以使用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"
}