รับดัชนีของค่าหนึ่งในอาร์เรย์ใน PHP


87

ฉันมีอาร์เรย์:

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

ฉันต้องการรับดัชนีสำหรับค่าที่กำหนด (เช่น1สำหรับstring2และ2สำหรับstring3)

สิ่งที่ฉันต้องการคือตำแหน่งของสตริงในอาร์เรย์

  • string1 คือ 0
  • string2 คือ 1
  • string3 คือ 2

จะบรรลุเป้าหมายนี้ได้อย่างไร?


8
เพื่อนนักเขียนด้านเทคโนโลยีของฉันบอกฉันว่า: "คุณไม่สามารถรับคำตอบที่ถูกต้องได้เว้นแต่คุณจะถามคำถามที่ถูกต้อง"
Bill Karwin

มันเก่าแล้ว .... แต่ฉันอยากรู้ว่าทำไม: "ฉันลอง array_search แล้ว แต่มันไม่มีประโยชน์"
dsdsdsdsd

โปรดทำเครื่องหมายคำตอบที่ได้รับคะแนนสูงกว่าว่ายอมรับแล้ว
robsch

หากคุณมีอาร์เรย์เชื่อมโยงอย่างที่ฉันทำคำตอบนี้จะช่วยได้: stackoverflow.com/a/3365793/470749
Ryan

คำตอบ:


159

array_search เป็นวิธีการทำ

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

จากเอกสาร :

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

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

คุณสามารถวนซ้ำอาร์เรย์ด้วยตนเองและค้นหาดัชนี แต่ทำไมต้องทำในเมื่อมีฟังก์ชันสำหรับสิ่งนั้น ฟังก์ชันนี้จะส่งคืนคีย์เสมอและจะทำงานได้ดีกับอาร์เรย์ที่เชื่อมโยงและปกติ


11
ส่งคืนคีย์ไม่ใช่ดัชนี ในตัวอย่างของคุณคีย์คือดัชนีของค่า
Jorge Ferreira

1
@smink อาร์เรย์ของ OP เป็นอาร์เรย์ที่ไม่เชื่อมโยงดังนั้นจึงทำงานได้ดี
Matthew Flaschen

ขออภัยฉันไม่ได้ระบุประเภทของอาร์เรย์ อาร์เรย์ที่ฉันใช้เป็นอาร์เรย์หลายมิติโปรดดูคำตอบของฉันสำหรับการแก้ปัญหา
Aakash Chakravarthy

ฉันมีอาร์เรย์ประเภทนี้: [0 => {id: 1, name: something}, 1 => {..... }, ... ] เป็นไปได้ไหมที่จะหาคีย์ / ดัชนีเช่น array_search ("name" => something, $ array)
lazzy_ms

แล้วถ้าอาร์เรย์มีลูกล่ะ?
zukijuki

19

หากคุณทำเพียงไม่กี่รายการ (และ / หรือขนาดอาร์เรย์มีขนาดใหญ่) แสดงว่าคุณมาถูกทางแล้วด้วย array_search:

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

หากคุณต้องการทั้งหมด (หรือมาก) การวนซ้ำจะช่วยคุณได้ดีกว่า:

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

1
foreach คือสิ่งที่ฉันต้องการ
zzapper

11

คนอื่น ๆ ได้แนะนำarray_search()ซึ่งให้คีย์ขององค์ประกอบอาร์เรย์ที่พบค่า คุณสามารถมั่นใจได้ว่าคีย์อาร์เรย์เป็นจำนวนเต็มติดกันโดยใช้array_values():

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

// result: 1

คุณพูดในคำถามของคุณว่าarray_search()ไม่มีประโยชน์ คุณอธิบายได้ไหมว่าทำไม? คุณลองทำอะไรแล้วไม่ตรงกับความต้องการของคุณ


"array_values ​​() is no use" .. ควรเป็น "array_search () was no use"
Vex

7

// หรือพิจารณาโครงสร้างอาร์เรย์ของคุณ:

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

// คุณทำได้แค่

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

// ดำเนินการ

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";

// หรือ

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";

// เรียกซ้ำ

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

// เอาต์พุต

//-- 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

ปัญหาคือคุณไม่มีดัชนีตัวเลขในอาร์เรย์ของคุณ
การใช้ array_values ​​() จะสร้างอาร์เรย์ที่มีดัชนีเป็นศูนย์ซึ่งคุณสามารถค้นหาโดยใช้ array_search () เพื่อข้ามความจำเป็นในการใช้สำหรับลูป

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

นี่เป็นวิธีที่สั้นที่สุดและใช้ได้ผลสำหรับคำถามนี้
Toni Tegar Sahidi

1

คุณสามารถระบุเพิ่มเติมได้หรือไม่?

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

ทำงานได้ดีสำหรับฉัน คุณกำลังพยายามทำสิ่งที่ซับซ้อนกว่านี้ให้สำเร็จหรือไม่?


1

รหัสนี้ควรทำเช่นเดียวกับกิจวัตรใหม่ของคุณโดยทำงานกับอาร์เรย์หลายมิติที่ถูกต้อง ..

 $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
คำถามไม่ได้กล่าวถึงอะไรเกี่ยวกับอาร์เรย์หลายมิติ (ความคิดเห็นของ OP ในคำตอบอื่น ๆ แสดงให้เห็นว่าคำตอบนี้คือสิ่งที่เขากำลังมองหาจริง ๆ แต่ถ้าคุณอ่านเฉพาะคำถามเดิมและคำตอบนี้สิ่งที่คุณกำลังพูดก็ไม่สมเหตุสมผล)
StubbornShowaGuy

1

คุณจะต้องสร้างฟังก์ชันสำหรับสิ่งนี้ ฉันไม่คิดว่าจะมีฟังก์ชันในตัวสำหรับจุดประสงค์นั้น อาร์เรย์ PHP ทั้งหมดเชื่อมโยงกันโดยค่าเริ่มต้น ดังนั้นหากคุณไม่แน่ใจเกี่ยวกับคีย์ของพวกเขานี่คือรหัส:

<?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 ควรทำงานได้ดีเพียงทดสอบสิ่งนี้และส่งคืนคีย์ตามที่คาดไว้:

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

หรือสำหรับดัชนีคุณสามารถใช้

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


-1

นี่คือฟังก์ชันที่จะใช้กับดัชนีตัวเลขหรือสตริง ส่งอาร์เรย์เป็นพารามิเตอร์แรกจากนั้นดัชนีไปยังองค์ประกอบที่ต้องการย้ายและสุดท้ายกำหนดทิศทางเป็น -1 เพื่อย้ายองค์ประกอบขึ้นและถึง 1 เพื่อเลื่อนลง ตัวอย่าง: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) จะย้าย Paul ขึ้นและ Peter ลง

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;

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.