跳过foreach循环php内部变量的第一个值
我在我的网站上有以下功能,它从跳过foreach循环php内部变量的第一个值,php,arrays,wordpress,foreach,key-value,Php,Arrays,Wordpress,Foreach,Key Value,我在我的网站上有以下功能,它从$vid_pix获取所有值,并在foreach循环中回显每个值或任何相关变量 这很好,但是我有一个变量-$Pt,它也会得到回音 现在我想做的是跳过$Pt中的第一个值。还为最后一个实例设置一个静态值,因为所有内容都向上移动1,最后一个实例没有值 我尝试了数组拼接和取消设置,但它没有跳过第一个$Pt值 所以如果我有- [vp 1]->[5] [vp 2]->[10] [vp 3]->[15] [vp 4]->[20] 我需要- [vp 1]-&
$vid_pix
获取所有值,并在foreach
循环中回显每个值或任何相关变量
这很好,但是我有一个变量-$Pt
,它也会得到回音
现在我想做的是跳过$Pt
中的第一个值。还为最后一个实例设置一个静态值,因为所有内容都向上移动1,最后一个实例没有值
我尝试了数组拼接
和取消设置
,但它没有跳过第一个$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]
[vp 1]->[10]
[vp 2]->[15]
...
(x=我必须为最后一个变量指定一个静态值。)
我的功能(为了简单而精简)
为了更好地理解这一点,下面是我试图在其中实现的特定函数的完整代码--
下面的链接包含保存$Pt
变量的原始代码--基于,$Pt
是数组的数组。因此,我们只需使用删除第一个值(第二级数组)。并在末尾附加一个静态值数组:
$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);
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
}
输出:
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
)
);
在这里现场查看:
使用这种类型的计数器跳过值…因为您已经知道您将获得每个
视频pix的照片时间,在您的问题中,我发现您需要获得当前视频pix的下一个视频pix的照片时间,忽略提供的第一个照片时间示例和最后一个vid_pix
(将某些内容改为静态)
我需要-
[vp 1]->[10]
[vp 2]->[15]
[vp 3]->[20]
[vp 4]->[x]
[vp 1]->[10]
[vp 2]->[15]
...
所以我认为它很简单(我使用vip\u pix index
作为键,你可以使用任何东西)
$pt_result=[];
对于($i=0;$i
由于$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\u post\u meta($vP,'photo\u 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);
更新#1
试着像这样使用array\u shift()
:
$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);
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\u time
meta(附件ID位于$vid\u 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
您可以使用array\u slice从数组中删除一组值,并使用array\u merge将其与“x”合并
然后您只需组合键和“新”值
这将产生:
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"
}
array_shift()?或者不要丢弃它,而是使用for循环,从第二个元素到最后一个元素迭代数组。@dnFer因为这样我还需要更改其他内容,所以我会尽量使它简单。您想要的示例与您的解释不符。您的示例暗示您希望跳过第一个元素,vp1
,但您的解释表明,get\u post\u meta
的输出不是您想要的。请澄清。不要跳过$Vp的第一个元素,请跳过第一个$Pt$Vp是一个ID号,$Pt是以与该ID相关联的形式输入的数字值。因此我希望ID#1具有ID#2中的$Pt值。。。现在有意义了吗@devdonkey他想跳过get\u post\u meta
的第一个值,而不是父数组。我和你一样读。这个问题模棱两可。还有,为什么要两张支票?如果(!$isFirst)
,为什么不做?谢谢,我已经更改了我的答案我已经用我的完整代码更新了我的问题,我也同意你的建议,但它没有改变任何东西。@Rich我真的不明白你想用这段代码实现什么,但是你没有像预期的那样使用我的代码。要么用$Pt
简单地替换所有$array
的出现,要么用$array=&$Pt
而不是简单地$array=$Pt
。此外,如果$Pt
是一个数组,为什么要将它连接到代码中的字符串?@Rich除非有更多的内联注释,否则不清楚您试图通过整个代码实现什么。不管怎样,基于你最初的要求,我相信我的建议可以帮助你实现that@Rich我已将代码与您的分条示例代码同步更新。请检查并让我知道!我试过你的代码,var dump的输出是--array(1){[0]=>string(1)“5”}数组(1){[0]=>string(1)“5”}数组(1){[0]=>string(1)“5”}数组(1){[0]=>string(1)“5”}
但我的实际值是-7,2,6,9,blank
@Rich$Pt的var_dump的输出也是什么?它是--数组(1){[0]=>string(1)“7”数组(1){[0]=>string(1)“2”数组(1){[0]=>string(1)“6”数组(1){[0]=>string(1)“9”数组(1){[0]=>string(0)”}
我不明白你的答案,你是说你的数组有值7,2,6,9,空白,无论是它的单个$Pt
值还是在$vid\u pix
循环之后,$Pt值是
$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
foreach ($vid_pix as $i => $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = $Pt2[ $i ];
...
}
$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"
}