मैं अब इसका खुद का हल लेकर आया हूं:
1. सरणियों से विशिष्ट विशेषताओं को निकालने के लिए एक सामान्य कार्य बनाया
एक साहचर्य सरणी, या साहचर्य सरणियों की एक सरणी से केवल विशिष्ट विशेषताएँ निकालने के नीचे का कार्य (अंतिम है जो आपको $ कलेक्शन करते समय मिलता है-> toArray () लारवेल में)।
इसका उपयोग इस तरह किया जा सकता है:
$data = array_extract( $collection->toArray(), ['id','url'] );
मैं निम्नलिखित कार्यों का उपयोग कर रहा हूं:
function array_is_assoc( $array )
{
return is_array( $array ) && array_diff_key( $array, array_keys(array_keys($array)) );
}
function array_extract( $array, $attributes )
{
$data = [];
if ( array_is_assoc( $array ) )
{
foreach ( $attributes as $attribute )
{
$data[ $attribute ] = $array[ $attribute ];
}
}
else
{
foreach ( $array as $key => $values )
{
$data[ $key ] = [];
foreach ( $attributes as $attribute )
{
$data[ $key ][ $attribute ] = $values[ $attribute ];
}
}
}
return $data;
}
यह समाधान बड़े डेटासेट में संग्रह के माध्यम से लूपिंग पर प्रदर्शन निहितार्थ पर ध्यान केंद्रित नहीं करता है।
2. एक कस्टम संग्रह I Laravel के माध्यम से उपरोक्त को लागू करें
चूंकि मैं $collection->extract('id','url');
किसी भी संग्रह वस्तु पर बस करने में सक्षम होना चाहता हूं, इसलिए मैंने एक कस्टम संग्रह वर्ग लागू किया है।
पहले मैंने एक सामान्य मॉडल बनाया, जो एलोकेंट मॉडल का विस्तार करता है, लेकिन एक अलग संग्रह वर्ग का उपयोग करता है। आप सभी मॉडल को इस कस्टम मॉडल का विस्तार करने की आवश्यकता है, न कि एलोकेंट मॉडल की।
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Lib\Collection;
class Model extends EloquentModel
{
public function newCollection(array $models = [])
{
return new Collection( $models );
}
}
?>
दूसरे मैंने निम्नलिखित कस्टम संग्रह वर्ग बनाया:
<?php
namespace Lib;
use Illuminate\Support\Collection as EloquentCollection;
class Collection extends EloquentCollection
{
public function extract()
{
$attributes = func_get_args();
return array_extract( $this->toArray(), $attributes );
}
}
?>
अंत में, सभी मॉडलों को इसके बजाय अपने कस्टम मॉडल का विस्तार करना चाहिए:
<?php
namespace App\Models;
class Article extends Model
{
...
अब नहीं से कार्य करता है। उपर्युक्त $collection->extract()
विधि को उपलब्ध करने के लिए संग्रह द्वारा बड़े करीने से 1 का उपयोग किया जाता है ।
Collection::implode()
। यह एक संपत्ति ले सकता है और संग्रह में सभी वस्तुओं से इसे निकाल सकता है। यह इस प्रश्न का सटीक उत्तर नहीं देता है, लेकिन यह उन अन्य लोगों के लिए उपयोगी हो सकता है जो Google से यहां आए हैं, जैसा कि मैंने किया था। laravel.com/docs/5.7/collections#method-implode