Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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
跳过foreach循环php内部变量的第一个值_Php_Arrays_Wordpress_Foreach_Key Value - Fatal编程技术网

跳过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"
}