将一个元素移动到数组的末尾

9

我有一个包含网页排名数值列表的数组。考虑下面的数组:

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
        )

如何将元素添加到数组末尾并使其位于数组的最后一个索引位置?

编辑:数组键未知。


1
这是你需要的吗?https://dev59.com/wHE95IYBdhLWcg3wUcRn - Andrius Naruševičius
1
你可以使用array_slice函数。 - som
会有多少个 R?只有一个吗? - Prasanth Bendra
@PrasanthBendra,这里只有一个R。 - Irfan
你应该更新你的问题,澄清你不知道数组键。 - Pitchinnate
@IrfanDayan 那么,我可以安全地假设,这个答案:https://dev59.com/wHE95IYBdhLWcg3wUcRn#2359699(uksort部分)对你没有帮助吗?如果是的话,请解释一下原因。否则,为什么你没有读完整个答案呢? - Andrius Naruševičius
10个回答

14

如果索引未知:

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);
}

1
FYI,更改正在迭代的数组是不好的做法。=) - liding
@liding 但是 break; 停止了迭代,所以在数组被更改后它不再被使用。 - Pitchinnate
虽然在迭代数组时修改它是安全的,但我认为@liding提出了一个很好的观点,因为大多数人可能会认为以这种方式修改数组是安全的。 - ILikeTacos

4
$item = $array[2];
unset($array[2]);
array_push($array, $item); 

值为'R'的索引不可知。当我输出数组时,它可以在任何索引处,例如[5]或[11]。我唯一知道的是值'R',我想将该元素移到数组末尾。 - Irfan

1
像这样的东西?
$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/


1
    $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);

2
$value 将是一个对象,它永远不会等于 'R'。 - Pitchinnate
@Irfan Dayan,没问题,请检查已更正的答案,使用 $array['pagerank'] 替代 $array。 - internals-in

0

如果您有多个具有“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);

1
FYI,在 OP 中它是一个对象数组,而不是一个数组的数组。 - Pitchinnate

0

如果你想将 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”的对象的键。 - Casper André Casse

0

试试这个:

$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 中它是一个对象数组,而不是一个数组的数组。 - Pitchinnate

0
如果你要查找的是r的值,你可以使用array_searcharray_search会返回数组中存在的项的键,否则返回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
}

它们是数组中的对象,而不是值。 - Pitchinnate

0
foreach ($arr as $key => $value){
    if ($value->pagerank == 'R'){
        $arr[] = $value;
        unset($arr[$key]);
        break;
    }
}
$arr = array_values($arr);

0

只需使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接