length - php array functions



PHP-ابحث عن الادخال بواسطة خاصية العنصر من مصفوفة من العناصر (6)

أنا فعلت هذا مع نوع من خريطة مفاتيح جافا. إذا قمت بذلك ، لن تحتاج إلى تكرار حلقة فوق مجموعة الكائنات في كل مرة.

<?php

//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);

//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
    //fill second        key          value
    $secondArray[$value->id] = $value->name;
}

var_dump($secondArray);

echo $secondArray['123'];

انتاج:

array (size=2)
  0 => 
    object(stdClass)[1]
      public 'id' => int 123
      public 'name' => string 'Henk' (length=4)
      public 'age' => int 65
  1 => 
    object(stdClass)[2]
      public 'id' => int 273
      public 'name' => string 'Koos' (length=4)
      public 'age' => int 25
array (size=2)
  123 => string 'Henk' (length=4)
  273 => string 'Koos' (length=4)
Henk

تبدو المصفوفة كما يلي:

[0] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
         )

[1] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
         )
...

ولدي متغير صحيح يسمى $v .

كيف يمكنني تحديد إدخال مصفوفة يحتوي على كائن يحتوي على خاصية "المعرف" $v ؟


Answer #1

أنا في بعض الأحيان مثل استخدام وظيفة array_reduce() لتنفيذ البحث. إنها مشابهة لـ array_filter () ولكنها لا تؤثر على مصفوفة البحث ، مما يسمح لك بإجراء عمليات بحث متعددة على نفس مجموعة الكائنات.

$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find

//carry out the search
$search_results_array = array_reduce(
  $haystack,

  function($result_array, $current_item) use ($needle){
      //Found the an object that meets criteria? Add it to the the result array 
      if ($current_item->someProperty == $needle){
          $result_array[] = $current_item;
      }
      return $result_array;
  },
  array() //initially the array is empty (i.e.: item not found)
);

//report whether objects found
if (count($search_results_array) > 0){
  echo "found object(s): ";
  print_r($search_results_array[0]); //sample object found
} else {
  echo "did not find object(s): ";
}

Answer #2

إما أن تقوم بتكرار الصفيف ، بالبحث عن السجل المعين (موافق في مرة واحدة فقط البحث) أو إنشاء hashmap باستخدام صفيف اقتران آخر.

للأول ، شيء من هذا القبيل

$item = null;
foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

انظر هذا السؤال والإجابات لاحقة لمزيد من المعلومات حول هذا الأخير - مرجع PHP صفيف من قبل العديد من الفهارس


Answer #3

استخدام array_column لإعادة الفهرسة سيوفر الوقت إذا كنت تريد العثور على عدة مرات:

$lookup = array_column($arr, NULL, 'id');   // re-index by 'id'

ثم يمكنك ببساطة $lookup[$id] .


Answer #4

YurkamTim على حق. يحتاج فقط إلى تعديل: (عذراً لا أستطيع التعليق الآن).

بعد الدوال ($) تحتاج إلى مؤشر للمتغير الخارجي عن طريق "استخدام (& search searchValue)" ثم يمكنك الوصول إلى المتغير الخارجي. كما يمكنك تعديله.

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue;
    }
);

Answer #5
$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)




object