在foreach循环php

时间:2018-09-11 14:09:27

标签: php arrays wordpress foreach key-value

我的网站上具有以下功能,该功能可从$vid_pix中获取所有值,并在foreach循环中分别 echos 每个值或任何关联的变量。

哪个工作正常,但是我有一个变量-$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 = "\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

的原始代码。

10 个答案:

答案 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)

更新#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

在此$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
  )
);

在此处实时查看:https://repl.it/repls/PerfectUpsetAnalysts

答案 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"
}

https://3v4l.org/l7NBa