【问题标题】:Get previous and next values in array获取数组中的上一个和下一个值
【发布时间】:2013-10-03 18:29:47
【问题描述】:

我有数组,例如:

<?php
$array = array(
  0 => array(
     'subject' => 'Stackoverflow',
     'body'    => '',
     'name'    => 'php'
   ),
  1 => array(
     'subject' => 'Test',
     'body'    => 'Wayne',
     'name'    => ''
   ),
  2 => array(
     'subject' => '',
     'body'    => 'this is ok',
     'name'    => ''
   ),
  3 => array(
     'subject' => 'cnn',
     'body'    => 'Google',
     'name'    => 'private'
   ),
  4 => array(
     'subject' => 'code',
     'body'    => '',
     'name'    => '7777'
   )
);

我想获取键 2 的主题、正文和名称,如果键不存在,那么这应该从上一个和下一个(单独的函数)值中获取。

例如,如果我想从 2 个键中获取值:

function getCurrentOrPrevious(2); 

应该返回:

   array(
     'subject' => 'Test', //from [1]
     'body'    => 'this is ok', //from [2] - current and exist
     'name'    => 'php' //from [0] - in from [2] and [1] not exist
   )

function getCurrentOrNext(2); 

应该返回:

   array(
     'subject' => 'cnn', //from [3]
     'body'    => 'this is ok', //from [2] - current
     'name'    => 'php' //from [3] 
   )

最好的方法是什么? PHP中是否有用于此类操作的函数?

LIVE

【问题讨论】:

  • 没有现成的 php 函数。如果其他状态,您将不得不这样做。
  • 那我该怎么做呢?

标签: php arrays


【解决方案1】:

假设,你填充你的数组类似于 $array[] = $value; [IE。你有从零开始的连续数字键]:

## $array is the array to take values from, $key is the target key
## $fields are required fields
function getCurrentOrPrevious($array, $key, $fields) {
    if ($key < 0) return null;
    $output = array();
    foreach ($fields as $field) {
       for ($i = $key; $i >= 0; $i--) {
         if (!empty($array[$i][$field])) {
            $output[$field] = $array[$i][$field];
            break;
         }
    }
    return $output;
}

如下使用:

$my_values = getCurrentOrPrevious($array, 12, array('subject', 'body', 'name'));

【讨论】:

    【解决方案2】:

    我猜你可以使用 php 的empty() 函数来检查。您还应该考虑该功能外壳能走多远?

    • 如果[3](下一个)在同一位置也有一个空值怎么办
    • 如果之前的索引是&lt;0怎么办?

    更新

    function getCurrOrNext($array, $index){
        $keys = array_keys($array[$index]);
        foreach($keys AS $key){
            if($array[$index][$key] == "") {
                $array[$index][$key] = (!empty($array[$index+1]) && !empty($array[$index+1][$key])?$array[$index+1][$key]:null);
            }
        }
        return $array;
    }
    

    我猜是这样的

    【讨论】:

    • 在这种情况下应该返回 null
    • 谢谢,但如果我通过 $index = 2 那么 for body 应该返回 '这没关系'
    • 我不明白你的问题?什么意思?
    【解决方案3】:
    function getCurrentOrPrev($array, $key) {
        while(key($array)!==$key) next($array); //move internal pointer to required position first
        $result = current($array);
    
        //loop is going to execute as long as at least one of elements is empty and we didn't get to beginning of array yet
        while((empty($result['subject'])
              || empty($result['body'])
              || empty($result['name'])) 
              && prev($array)!==false) {
            $c = current($array);
            //replace empty elements with values of current element
            $result['subject'] = empty($result['subject']) ? $c['subject'] : '';
            $result['body'] = empty($result['body']) ? $c['body'] : '';
            $result['name'] = empty($result['name']) ? $c['name'] : '';
        }
    
        return $result;
    }
    

    对于带有 next 的函数,只需将 prev() 方法替换为 next(),或尽量减少代码重复您可以引入第三个参数并根据其值调用正确的方法。

    此方法不关心其他键的值,但参数中指定的键。 您可能有混合的文字和数字索引。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多