Nhận giá trị chỉ mục của một mảng trong PHP


87

Tôi có một mảng:

$list = array('string1', 'string2', 'string3');

Tôi muốn lấy chỉ mục cho một giá trị nhất định (tức là 1cho string22cho string3)

Tất cả những gì tôi muốn là vị trí của các chuỗi trong mảng

  • string1 là 0
  • string2 là 1
  • string3 là 2

Làm thế nào để đạt được điều này?


7
Một người bạn viết về công nghệ của tôi đã nói với tôi rằng: "Bạn không thể nhận được câu trả lời đúng trừ khi bạn hỏi đúng câu hỏi."
Bill Karwin

điều này là cũ .... nhưng tôi wold muốn biết lý do tại sao: "Tôi cố gắng array_search nhưng nó đã không sử dụng"
dsdsdsdsd

Vui lòng đánh dấu câu trả lời được đánh giá cao hơn là được chấp nhận.
robsch

Nếu bạn có một mảng liên kết, như tôi đã làm, câu trả lời này sẽ hữu ích: stackoverflow.com/a/3365793/470749
Ryan

Câu trả lời:


158

array_search là cách để làm điều đó.

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

Từ các tài liệu :

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

Bạn có thể lặp lại mảng theo cách thủ công và tìm chỉ mục nhưng tại sao phải làm điều đó khi có một hàm cho điều đó. Hàm này luôn trả về một khóa và nó sẽ hoạt động tốt với các mảng liên kết và bình thường.


10
Điều này trả về khóa, không phải chỉ mục. Trong ví dụ của bạn, khóa thuận tiện là chỉ mục của giá trị.
Jorge Ferreira

1
@smink, mảng của OP là mảng không liên kết, vì vậy nó hoạt động tốt.
Matthew Flaschen

xin lỗi, tôi đã không chỉ định loại mảng. Việc sử dụng mảng i là một mảng đa chiều xin vui lòng xem câu trả lời của tôi cho các giải pháp
Aakash Chakravarthy

Tôi có kiểu mảng này: [0 => {id: 1, name: something}, 1 => {.....}, ...]. Điều này có thể tìm thấy khóa / chỉ mục như array_search ("name" => gì đó, $ array) không?
lazzy_ms

Làm thế nào về nếu mảng có con?
zukijuki

19

Nếu bạn chỉ thực hiện một vài trong số chúng (và / hoặc kích thước mảng lớn), thì bạn đã đi đúng hướng với array_search:

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

Nếu bạn muốn tất cả (hoặc nhiều trong số chúng), một vòng lặp sẽ giúp bạn làm tốt hơn:

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "

1
foreach là những gì tôi cần
zzapper

11

Những người khác đã đề xuất array_search()cung cấp khóa của phần tử mảng nơi giá trị được tìm thấy. Bạn có thể đảm bảo rằng các khóa mảng là các số nguyên liền nhau bằng cách sử dụng array_values():

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

Bạn đã nói trong câu hỏi của mình rằng array_search()không có ích gì. Bạn có thể giải thích lý do tại sao? Bạn đã thử những gì và làm thế nào nó không đáp ứng nhu cầu của bạn?


"array_values ​​() không được sử dụng" .. phải là "array_search () không được sử dụng"
Vex

7

// hoặc xem xét cấu trúc mảng của bạn:

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

// bạn có thể

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

// Thực thi

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

// cách khác

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

// đệ quy

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

// kết quả đầu ra

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

6

Vấn đề là bạn không có chỉ mục số trên mảng của mình.
Sử dụng array_values ​​() sẽ tạo ra một mảng không được lập chỉ mục mà sau đó bạn có thể tìm kiếm bằng cách sử dụng array_search () bỏ qua nhu cầu sử dụng vòng lặp for.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));

cho đến nay đây là phương pháp ngắn nhất và hiệu quả cho câu hỏi,
Toni Tegar Sahidi

1

Bạn có thể nêu chi tiết hơn được không?

$key = array_search('string2',$list)

làm việc tốt cho tôi. Bạn đang cố gắng hoàn thành một cái gì đó phức tạp hơn?


1

Mã này sẽ hoạt động giống như quy trình mới của bạn, làm việc với đúng mảng đa chiều ..

 $arr = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => '')
 );

 echo 'Index of "string2" = '. array_search('string2', array_keys($arr));

1
Câu hỏi không đề cập đến mảng đa chiều (nhận xét của OP trong các câu trả lời khác cho thấy rằng câu trả lời này là những gì anh ấy thực sự đang tìm kiếm, nhưng nếu bạn chỉ đọc câu hỏi ban đầu và câu trả lời này, những gì bạn đang nói sẽ không có ý nghĩa gì)
StubbornShowaGuy

1

Bạn sẽ phải tạo một hàm cho việc này. Tôi không nghĩ rằng có bất kỳ chức năng tích hợp nào cho mục đích đó. Tất cả các mảng PHP là liên kết theo mặc định. Vì vậy, nếu bạn không chắc chắn về khóa của họ, đây là mã:

<?php

$given_array = array('Monday' => 'boring',
'Friday' => 'yay',
'boring',
'Sunday' => 'fun',
7 => 'boring',
'Saturday' => 'yay fun',
'Wednesday' => 'boring',
'my life' => 'boring');

$repeating_value = "boring";

function array_value_positions($array, $value){
    $index = 0;
    $value_array = array();
        foreach($array as $v){
            if($value == $v){
                $value_array[$index] = $value;
            }
        $index++;
        }
    return $value_array;
}

$value_array = array_value_positions($given_array, $repeating_value);

$result = "The value '$value_array[0]' was found at these indices in the given array: ";

$key_string = implode(', ',array_keys($value_array));

echo $result . $key_string . "\n";//Output: The value 'boring' was found at these indices in the given array: 0, 2, 4, 6, 7



0

array_search sẽ hoạt động tốt, chỉ cần kiểm tra điều này và nó trả về các khóa như mong đợi:

$list = array('string1', 'string2', 'string3');
echo "Key = ".array_search('string1', $list);
echo " Key = ".array_search('string2', $list);
echo " Key = ".array_search('string3', $list);

Hoặc đối với chỉ mục, bạn có thể sử dụng

$list = array('string1', 'string2', 'string3');
echo "Index = ".array_search('string1', array_merge($list));
echo " Index = ".array_search('string2', array_merge($list));
echo " Index = ".array_search('string3', array_merge($list));

0
$find="Topsite";
$list=array("Tope","Ajayi","Topsite","Infotech");
$list_count=count($list);
sort($list);
for($i=0;$i<$list_count;$i++)
{
    if($list[$i]==$find){
         $position=$i;
    }

}
echo $position;

-1

Đây là một hàm sẽ hoạt động cho các chỉ số dạng số hoặc chuỗi. Truyền mảng làm tham số đầu tiên, sau đó là chỉ mục cho phần tử cần di chuyển và cuối cùng đặt hướng thành -1 để di chuyển phần tử lên và đến 1 để di chuyển phần tử đó xuống. Ví dụ: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) sẽ di chuyển Paul lên và Peter xuống.

function Move($a,$element,$direction)
{

$temp = [];
$index = 0;

foreach($a as $key=>$value)
{
    $temp[$index++] = $key;
}

$index = array_search($element,$temp);

$newpos = $index+$direction;

if(isset($temp[$newpos]))
{
        $value2 = $temp[$newpos];
        $temp[$newpos]=$element;
        $temp[$index]=$value2;
}
else
{
    # move is not possible
    return $a; # returns the array unchanged
}   

$final = [];

foreach($temp as $next)
{
    $final[$next]=$a[$next];
}

return $final;

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.