【问题标题】:Shift an element to the end of array将一个元素移动到数组的末尾
【发布时间】:2013-07-19 13:02:39
【问题描述】:

我有一个包含 pagrank 值列表的数组。考虑下面的数组:

Array
(
    [0] => stdClass Object
        (
            [pagerank] => 3
        )

    [1] => stdClass Object
        (
            [pagerank] => 1
        )

    [2] => stdClass Object
        (
            [pagerank] => R
        )

    [3] => stdClass Object
        (
            [pagerank] => 2
        )

    [4] => stdClass Object
        (
            [pagerank] => 7
        )

)

我想用“R”来移动/移动页面排名,例如:

[2] => stdClass Object
        (
            [pagerank] => R
        )

到数组的末尾,它应该在数组的最后一个索引上?

编辑:数组键未知。

【问题讨论】:

  • 这是您需要的吗? stackoverflow.com/questions/2359652/…
  • 你可以使用array_slice
  • 还有多少 R ?只有一个?
  • @PrasanthBendra,那里只有一个 R。
  • 您应该更新您的问题以澄清您不知道数组键。

标签: php arrays sorting


【解决方案1】:

如果索引未知:

foreach($array as $key => $val) {
    if($val->pagerank == 'R') {
        $item = $array[$key];
        unset($array[$key]);
        array_push($array, $item); 
        break;
    }
}

如果您不想在迭代时修改数组,只需找到索引然后进行修改。

$foundIndex = false;
foreach($array as $key => $val) {
    if($val->pagerank == 'R') {
        $foundIndex = $key;
        break;
    }
}
if($foundIndex !== false) {
    $item = $array[$foundIndex];
    unset($array[$foundIndex]);
    array_push($array, $item);
}

【讨论】:

  • 仅供参考,更改迭代的数组是一种不好的做法。 =)
  • @liding 但是break; 会停止迭代,因此数组在更改后不会被使用。
  • 虽然在迭代过程中对数组进行修改是安全的,但我认为@liding 提出了一个很好的观点,因为大多数人可能认为以这种方式修改数组是安全的。
【解决方案2】:
$item = $array[2];
unset($array[2]);
array_push($array, $item); 

【讨论】:

  • 值“R”的索引不可知。当我输出我的数组时,它可以在任何索引上,就像它可以在 [5] 或 [11] 上。我唯一知道的是值“R”,我想将该元素移到数组的末尾
【解决方案3】:

这样的?

$var = array(
    'name' => 'thename',
    'title' => 'thetitle',
    'media' => 'themedia'
);

// Remove first element (the name)
$name = array_shift($var);
// Add it on to the end
$var['name'] = $name;

var_dump($var);

/*
array(3) {
  ["title"]=>
  string(8) "thetitle"
  ["media"]=>
  string(8) "themedia"
  ["name"]=>
  string(7) "thename"
}
*/

参考:http://forums.phpfreaks.com/topic/177878-move-array-index-to-end/

【讨论】:

    【解决方案4】:
        $item=null;
        foreach ($array['pagerank'] as $key => $value) 
        {
         if( $value=="R")
         {
         $item = $array[$key];
         unset($array[$key]);
         break;
         }
        }
         if($item !=null)
         array_push($array, $item);
    

    【讨论】:

    • $value 将是一个永远不会等于“R”的对象
    • @Irfan Dayan 没关系检查更正的答案使用 $array['pagerank'] 而不是 $array
    【解决方案5】:

    试试这个:

    $arr  = array(array("pagerank" => 3),
                  array("pagerank" => 1),
                  array("pagerank" => 'R'),
                  array("pagerank" => 4),
                  array("pagerank" => 7),
                  array("pagerank" => 5),
                  array("pagerank" => 2)
            );
    
    foreach($arr as $key=>$ar){
       if($ar["pagerank"] == "R"){
         $unset  = $key;
         break;
       }
    }
    
    $val    = $arr[$unset];
    unset($arr[$unset]);
    $arr[]  = $val; 
    
    print_r($arr);
    

    【讨论】:

    • 仅供参考,在 OP 中它是对象数组,而不是数组数组。
    【解决方案6】:

    如果您要查找的具体是 r 的值,您可以使用array_search

    array_search如果数组中存在元素则返回key,否则返回false。

    $needle = "R";
    if($key = array_search($needle, $pageRankArray)) {
       unset($pageRankArray[$key]); // Delete an item from the array
       array_push($pageRankArray, $needle); // inserts element at the end of the array
    }
    

    【讨论】:

    • 它们是数组中的对象而不是值。
    【解决方案7】:

    如果您想将 R 作为最后一个值并保留您的密钥,您可以这样做:

    $arr = array(
        (object)array('pagerank' => 1),
        (object)array('pagerank' => 'R'),
        (object)array('pagerank' => 2),
    );
    
    // Store in temp var.
    $tmp_arr = $arr;
    
    // Sort temp array to put 'R' in top.
    asort($tmp_arr);
    
    // Reset to be able to find the first key in the sorted array.
    reset($tmp_arr);
    
    // Get key from first value in array.
    $key = key($tmp_arr);
    
    // Store value from first key.
    $item = $tmp_arr[$key];
    
    // Unset key from original array.
    unset($arr[$key]);
    
    // Insert as last value in original array using original key.
    $arr[$key] = $item;
    
    // Print result.
    var_dump($arr);
    

    这会给你:

    array(3) {
      [0]=>
      object(stdClass)#1 (1) {
        ["pagerank"]=>
        int(1)
      }
      [2]=>
      object(stdClass)#3 (1) {
        ["pagerank"]=>
        int(2)
      }
      [1]=>
      object(stdClass)#2 (1) {
        ["pagerank"]=>
        string(1) "R"
      }
    }
    

    见:http://codepad.org/gPhrktuJ

    【讨论】:

    • 如果您不想保留所有原始密钥,那也可以。在我的示例中,数组中的键被保留。通过使用array_push,您会丢失值为“R”的对象的密钥。
    【解决方案8】:
    foreach ($arr as $key => $value){
        if ($value->pagerank == 'R'){
            $arr[] = $value;
            unset($arr[$key]);
            break;
        }
    }
    $arr = array_values($arr);
    

    【讨论】:

      【解决方案9】:

      如果您有多个具有“R”值的对象:

      $current_array = $sorted_array = Array(
          ...
      );
      foreach($current_array as $current_key => $element){
          if($element->pagerank == 'R'){
              unset($sorted_array[$current_key]);
              $sorted_array[] = $element;
          }
      }
      unset($current_array);
      

      【讨论】:

      • 仅供参考,在 OP 中它是一个对象数组,而不是数组数组。
      【解决方案10】:

      只需使用 array_filter。

      以$arr为输入数组:

      $arr=Array
      (
          (Object) ['pagerank' => 3],
          (Object) ['pagerank' => 1],
          (Object) ['pagerank' => "R"],
          (Object) ['pagerank' => 2],
          (Object) ['pagerank' => 7],
      );
      $result=array_filter($arr,function($item){return $item->pagerank!="R";})+$arr;
      var_dump($arr,$result);
      

      结果将是:

      array (size=5)
        0 => 
          object(stdClass)[1]
            public 'pagerank' => int 3
        1 => 
          object(stdClass)[2]
            public 'pagerank' => int 1
        2 => 
          object(stdClass)[3]
            public 'pagerank' => string 'R' (length=1)
        3 => 
          object(stdClass)[4]
            public 'pagerank' => int 2
        4 => 
          object(stdClass)[5]
            public 'pagerank' => int 7
      
      array (size=5)
        0 => 
          object(stdClass)[1]
            public 'pagerank' => int 3
        1 => 
          object(stdClass)[2]
            public 'pagerank' => int 1
        3 => 
          object(stdClass)[4]
            public 'pagerank' => int 2
        4 => 
          object(stdClass)[5]
            public 'pagerank' => int 7
        2 => 
          object(stdClass)[3]
            public 'pagerank' => string 'R' (length=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        相关资源
        最近更新 更多